簡単アプリの開発(3)
(3)イベント登録機能 -登録処理-
続いて、「Tables」オブジェクトを利用して、登録処理を実装します。
routesファイルに登録処理用のURLを定義します。
routes(/conf)
POST /event/create/create controllers.event.EventCreate.create
formの内容をSubmitするのでリクエストはPOSTメソッドを指定します。呼び出されるのは「EventCreate」オブジェクトの「create」メソッドです。
「EventCreate」オブジェクトに「create」メソッドを追加します。
[Controller]EventCreate.scala(/app/controllers)
package controllers.event
import play.api._
import play.api.mvc._
import play.api.data.Form
import play.api.data.Forms._
import scala.slick.model.codegen.SourceCodeGenerator
import models.Tables.EventRow
import models.{ EventForm, Events }
object EventCreate extends Controller {
/** イベントフォーム */
val eventForm = Form(
mapping(
"eventId" -> text,
"eventNm" -> text)(EventForm.apply)(EventForm.unapply))
/** 初期表示 */
def index = Action {
Ok(views.html.event.eventCreate(eventForm))
}
/** 登録 */
def create = Action { implicit request =>
val form = eventForm.bindFromRequest.get
val event = EventRow(0, form.eventId, form.eventNm)
Events.create(event)
Ok(views.html.event.eventCreate(eventForm))
}
/** コード生成 */
def generate = Action {
val slickDriver = "scala.slick.driver.H2Driver"
val outputFolder = "app"
val pkg = "models"
val model = Events.model
new SourceCodeGenerator(model).writeToFile(slickDriver, outputFolder, pkg)
Ok(views.html.event.eventCreate(eventForm))
}
}
「create」メソッドは、フォームの内容をケースクラス「EventRow」にセットしてEventsオブジェクトの「create」メソッドに渡し、画面で入力された情報をEVENTテーブルに登録します。「EventRow」の引数には登録対象データを設定しますが、第一引数の「ID」は自動採番(AutoInc)項目なので、仮の値「0」を設定しておきます。画面から入力されたフォームの値は、「implicit request =>」を定義することで「eventForm.bindFromRequest.get」によって取得することができます。登録が完了したら初期表示の「index」と同様に「eventCreate.scala.html」を返します。
次に、画面から入力されたイベント情報をDBに登録するための処理をモデルに実装します。
[Model]Events.scala(/app/models)
package models
import play.api.db.DB
import play.api.Play.current
import scala.slick.driver.H2Driver.simple._
import models.Tables.{ Event, EventRow }
import scala.slick.jdbc.meta.{ MTable, createModel }
import scala.slick.driver.JdbcDriver
object Events {
/** DBコネクション */
val database = Database.forDataSource(DB.getDataSource())
/** 登録 */
def create(e: EventRow) = database.withTransaction { implicit session: Session =>
Event.insert(e)
}
def model = database.withSession { implicit session =>
val tables = MTable.getTables(None, Some("TECHAPP"), None, None).list
createModel(tables, JdbcDriver)
}
}
「Events」オブジェクトにDBへのINSERT処理を行う「create」メソッドを追加します。引数で受け取った「EventRow」オブジェクトをDBにINSERTします。
イベント登録画面でSubmitするURLは仮の値として初期表示処理を設定していましたので、登録処理が呼び出されるように修正しておきます。「@helper.form」の「action」属性に「controllers.event.routes.EventCreate.create()」を設定します。
[View]eventCreate.scala.html(/app/views/event)
@(eventForm: Form[EventForm])
@import helper.twitterBootstrap._
@main("イベント登録") {
@helper.form(action = controllers.event.routes.EventCreate.create()){
<div class="container">
<fieldset>
<legend>イベントの情報</legend>
@helper.inputText(eventForm("eventId"))
@helper.inputText(eventForm("eventNm"))
<input type="submit" value="登録" class="btn btn-primary">
</fieldset>
<a href="@controllers.event.routes.EventCreate.generate()" class="btn">
generate
</a>
</div>
}
}
以上で登録機能が実装できましたので、実際にテーブルを作成してイベントを登録してみましょう。
登録できましたでしょうか? まだ登録したデータを確認する画面がありませんね。
今回は「イベント管理アプリ」を開発するための事前準備を行った後、DBアクセス用のオブジェクトをSlickのコードジェネレータを用いて自動生成し、イベント登録機能を実装しました。次回は、今回登録したイベント情報を参照するための画面、イベント検索一覧画面から作成していきます。今すぐ登録したデータを確認したい場合は、H2の「データベース・マネージャー」で確認してみてください。
なお、今回作成した「イベント管理アプリ」のソースコードはGitHubで公開しています。

