SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

ScalaのWebアプリケーションフレームワーク「Play Framework」入門
~(2)CRUD操作を行うWebアプリケーションの作成 前編

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第13回

簡単アプリの開発(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で公開しています。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

前出 祐吾(TIS株式会社)(マエデ ユウゴ)

TIS株式会社 コーポレート本部 戦略技術センター所属。これまで社内向けWebアプリケーションフレームワークの開発やJenkinsの活用を中心に様々な手段で開発の効率化を図ってきた。現在は、さらに革命的な効率化を目指し、Scalaを活用した次世代開発基盤の研究&開発に従事している。システム開発は、泥...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7816 2014/06/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー