SHOEISHA iD

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

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

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

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

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

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

簡単アプリの開発(3)

(2)イベント更新機能

 イベント検索画面の検索結果一覧から更新したいデータを選択することでイベント更新画面を表示します。イベント更新画面には選択したイベントの「イベントID」と「イベント名」が表示され、値を編集し「更新」ボタンをクリックすると、その内容でEVENTテーブルを更新するという機能とします。

 まずはroutesに更新画面の初期表示URLと更新処理のURLを定義します。更新対象データを特定するため、それぞれデータのキーにあたる「id」を引数とします。

routes(/conf)

GET     /event/:id/update/       controllers.event.EventUpdate.index(id: Int)
POST    /event/:id/              controllers.event.EventUpdate.update(id: Int)

 URLに「:id」のように変数名の前に「:」をつけて定義すると、「index(id: Int)」という形で、コントローラ呼び出し時の引数として指定することができます。例えば、上記「routes」ファイルの1行目のような定義をすると、「/event/100/update/」というURLにGETリクエストを受けた場合、「controllers.event.EventUpdate.index(100)」という形で「index」メソッドが呼び出されます。

 次にイベント更新画面を作成します。入力項目は「イベントID」と「イベント名」です。

[View]eventUpdate.scala.html(/app/views/event)

@(eventForm: Form[EventForm], id: Int)

@import helper.twitterBootstrap._

@main("イベント情報変更") {
  @helper.form(action = controllers.event.routes.EventUpdate.update(id)){
    <div class="container">
      <fieldset>
       <legend>イベントの情報</legend>
        @helper.inputText(eventForm("eventId"))
        @helper.inputText(eventForm("eventNm"))
        <input type="submit" value="更新" class="btn btn-primary">
      </fieldset>
    </div>
  }
}

 更新するためのキーとして「id」を引数として受け取り、「更新」ボタンをクリックすると、「EventUpdate」オブジェクトの「update」に「id」を引数としてSubmitします。

 コントローラには初期表示の「index」メソッドとイベント更新の「update」メソッドを作成します。

[Controller]EventUpdate.scala(/app/controllers/event)

package controllers.event

import play.api._
import play.api.mvc._
import play.api.data.Form
import play.api.data.Forms._
import models.{ EventForm, Events }
import models.Tables.EventRow

object EventUpdate extends Controller {

  /** イベントフォーム */
  val eventForm = Form(
    mapping(
      "eventId" -> text,
      "eventNm" -> text)(EventForm.apply)(EventForm.unapply))

  /** 初期表示 */
  def index(id: Int) = Action {
    val event = Events.findById(id)
    val form = EventForm(event.eventId, event.eventNm)

    Ok(views.html.event.eventUpdate(eventForm.fill(form), id))
  }

  /** 更新 */
  def update(id: Int) = Action { implicit request =>
    val form = eventForm.bindFromRequest.get
    val event = EventRow(id, form.eventId, form.eventNm)
    Events.update(event)

    Ok(views.html.event.eventUpdate(eventForm, id))
  }

}

 「index」は「id」を引数として受け取り、「Events」オブジェクトの「findById」で更新対象のイベントデータを取得、そのデータを「EventForm」に詰めて、「eventUpdate.scala.html」に渡します。「update」は「id」と更新対象データを画面から受け取り「Events」オブジェクトの「update」メソッドでイベントデータを更新し、元の画面を表示します。

 「Events」オブジェクトに「findById」と「update」メソッドを実装します。「findById」はEVENTテーブルのキーである「id」を引数として受け取り、EVENTテーブルを検索し、得た結果を「EventRow」クラスで返します。「update」は「EventRow」クラスを引数で受け取り、その内容で「id」をキーとしてEVENTテーブルを更新します。

[Model]Events.scala(/app/models)

/** ID検索 */
def findById(id: Int): EventRow =
  database.withTransaction { implicit session: Session =>
  Event.filter(_.id === id).first
}

/** 更新 */
def update(e: EventRow) = database.withTransaction { implicit session: Session =>
  Event.filter(_.id === e.id).update(e)
}

 イベント検索画面から更新したいデータを選択し更新画面に遷移できるように、検索結果一覧の右端にリンク用のアイコンを作成しておきます。

[View]eventSearch.scala.html(/app/views/event)

@(eventForm: Form[EventForm], events: List[Tables.EventRow])

@import helper.twitterBootstrap._

@main("イベント検索") {
  @helper.form(action = controllers.event.routes.EventSearch.search()){
    <div class="container">
      <fieldset>
        <legend>検索条件</legend>
        @helper.inputText(eventForm("eventId"))
        @helper.inputText(eventForm("eventNm"))
        <button type="submit" class="btn btn-primary">検索</button>
      </fieldset>

      @if(events) {
        <legend>イベント一覧</legend>
        <table class="table table-striped table-bordered table-hover">
          <thead>
            <tr>
              <th>イベントID</th>
              <th>イベント名</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            @for((event) <- events){
              <tr>
                <td>@event.eventId</td>
                <td>@event.eventNm</td>
                <td>
                  <a href="@controllers.event.routes.EventUpdate.index(event.id)">
                    <i class="glyphicon glyphicon-edit"></i>
                  </a>
                </td>
              </tr>
            }
          </tbody>
        </table>
      }
    </div>
  }
}

 以上でイベント更新画面が実装できましたので、画面から確認してみましょう。まずはイベント検索画面を表示し検索を行います。

 先ほど登録したデータが表示されましたので、検索結果一覧の一番右の列に表示された更新アイコンをクリックし更新画面を表示します。イベント更新画面が表示されたらデータを編集し更新してみましょう。

 更新が終わったら、イベント検索画面で結果を確認してみましょう。

次のページ
簡単アプリの開発(4)

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

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー