Play2.8-scalikejdbc3.4s

ユーザ削除APIの実装

指定したIDのユーザをUSERSテーブルから削除します。 コントローラ JsonControllerのremoveメソッドを以下のように実装します。 def remove(id: Long) = Action { implicit request => DB.localTx { implicit session => // ユーザを削除 Users.find(id).foreach { user => Users.destroy(user) } Ok(Json.obj("result" -> "success")) } } 実行 コマンドラインから以下のコマンドを実行してユーザが削除されることを確認してください。 curl -XPOST http://localhost:9000/json/remove/1

ユーザ登録・更新APIの実装

ユーザ情報をJSONで受け取り、登録もしくは更新を行います。 Readsの定義 JsonControllerのコンパニオンオブジェクトにユーザ情報を受け取るためのケースクラスと、JSONからそのケースクラスに変換するためのReadsを定義します。 object JsonController { ... // ユーザ情報を受け取るためのケースクラス case class UserForm(id: Option[Long], name: String, companyId: Option[Int]) // JSONをUserFormに変換するためのReadsを定義 implicit val userFormReads = ( (__ \ "id" ).readNullable[Long] and (__ \ "name" ).read[String] and (__ \ "companyId").readNullable[Int] )(UserForm) } 前述のWritesと同様、DSLを使わずに以下のように記述することもできます。 implicit val userFormFormat = new Reads[UserForm]{ def reads(js: JsValue): UserForm = { UserForm( id = (js \ "id" ).

ユーザ登録・編集画面の実装

リクエストパラメータにIDが指定されているかどうかに応じて以下の処理を行います。 リクエストパラメータにIDなし ⇒ 新規登録画面を表示します。 リクエストパラメータにIDあり ⇒ USERSテーブルを検索し、該当のユーザ情報を初期表示した編集画面を表示します。 フォーム 画面からの入力値を受け取るためのFormを定義します。Formは必ずしもコントローラに定義する必要はないのですが、コントローラでの処理に強く依存するため特に理由がない限りコントローラクラスのコンパニオンオブジェクトに定義するとよいでしょう。 ここではUserControllerと同じソースファイルに以下のようなコンパニオンオブジェクトを追加します。 object UserController { // フォームの値を格納するケースクラス case class UserForm(id: Option[Long], name: String, companyId: Option[Int]) // formから送信されたデータ ⇔ ケースクラスの変換を行う val userForm = Form( mapping( "id" -> optional(longNumber), "name" -> nonEmptyText(maxLength = 20), "companyId" -> optional(number) )(UserForm.apply)(UserForm.unapply) ) } コンパニオンオブジェクトとは、クラスやトレイトと同じファイル内に同じ名前で定義されたオブジェクトのことで、コンパニオンオブジェクトと対応するクラスやトレイトは互いにprivateなメンバーにアクセスできるなどの特徴があります。クラスやトレイトで使用する共通的なメソッドやクラス等を括り出したりするのに使います。 POINT コンパニオンオブジェクトとは、クラスと同じファイル内に同じ名前で定義されたオブジェクトのことです FormはStrutsのアクションフォームのようなものです マッピングに従ってバリデーション(後述)が行われます ビュー 続いてviews.userパッケージにedit.scala.htmlを実装します。引数にはFormのインスタンスと、プルダウンで選択する会社情報を格納したSeqを受け取ります。

ルーティングの定義

Bootstrapを使うための準備 sbt newコマンドで作成されたプロジェクトにはデフォルトのレイアウトテンプレートとしてapp/views/main.scala.htmlが生成されています。ここにBootstrapで使用するCSSとJavaScriptを追加します。 @* * This template is called from the `index` template. This template * handles the rendering of the page header and body tags. It takes * two arguments, a `String` for the title of the page and an `Html` * object to insert into the body of the page. *@ @(title: String)(content: Html) <!DOCTYPE html> <html lang="en"> <head> @* Here's where we render the page title `String`.

削除処理の実装

指定したIDのユーザをUSERSテーブルから削除し、一覧画面へリダイレクトします。 コントローラ すでに一覧画面に「削除」ボタンは表示されているので、そこから呼び出されるコントローラのメソッドのみ実装します。 def remove(id: Long) = Action { implicit request => DB.localTx { implicit session => // ユーザを削除 Users.find(id).foreach { user => Users.destroy(user) } // 一覧画面へリダイレクト Redirect(routes.UserController.list) } } ここでもscalikejdbcGenで自動生成されたUsers.destroy()メソッドを使用して削除処理を行っています。これをQueryDSLで書き直すと以下のようになります。 withSQL { delete.from(Users).where.eq(Users.column.id, entity.id) }.update.apply() 実行 一覧画面から「削除」をクリックしてユーザ情報が削除されることを確認してください。

登録・更新処理の実装

入力値のバリデーションを行い、エラーの有無に応じて以下の処理を行います。 エラーあり ⇒ フォームにエラー情報をセットして入力フォームに戻ります。 エラーなし ⇒ DBへの登録・更新処理を行い、一覧画面へリダイレクトします。 コントローラ UserControllerのメソッドのうち、登録処理を行うcreateメソッドと更新処理を行うupdateメソッドを実装します。 入力フォームの値を受け取るには、userForm.bindFromRequestメソッドでリクエストの内容をFormにバインドし、foldメソッドでエラーがあった場合の処理と、OKの場合の処理を記述します。以下はcreateメソッドの実装例です。 def create = Action { implicit request => DB.localTx { implicit session => // リクエストの内容をバインド userForm.bindFromRequest.fold( // エラーの場合 error => { BadRequest(views.html.user.edit(error, Companies.findAll())) }, // OKの場合 form => { // ユーザを登録 Users.create(form.name, form.companyId) // 一覧画面へリダイレクト Redirect(routes.UserController.list) } ) } } updateメソッドも同じように実装します。 def update = Action { implicit request => DB.