簡単アプリの開発(5)
(5)ナビゲータの追加
最後に、各画面を行き来できるように画面上部にナビゲータを追加しておきましょう。
イベント登録画面には「検索」「登録」のラベルを表示し、「登録」をアクティブにします。
[View]eventCreatescala.html(/app/views/event)
<ul class="nav nav-tabs">
<li>
<a href="@controllers.event.routes.EventSearch.index()" data-toggle="tab">検索</a>
</li>
<li class="active">
<a href="#" data-toggle="tab">登録</a>
</li>
</ul>
イベント検索画面にも「検索」「登録」のラベルを表示し、「検索」をアクティブにします。
[View]eventSearch.scala.html(/app/views/event)
<ul class="nav nav-tabs">
<li class="active">
<a href="#" data-toggle="tab">検索</a>
</li>
<li>
<a href="@controllers.event.routes.EventCreate.index()" data-toggle="tab">登録</a>
</li>
</ul>
イベント更新画面には「検索」「登録」「更新」のラベルを表示し、「更新」をアクティブにします。
[View]eventUpdate.scala.html(/app/views/event)
<ul class="nav nav-tabs">
<li>
<a href="@controllers.event.routes.EventSearch.index()" data-toggle="tab">検索</a>
</li>
<li>
<a href="@controllers.event.routes.EventCreate.index()" data-toggle="tab">登録</a>
</li>
<li class="active">
<a href="#" data-toggle="tab">更新</a>
</li>
</ul>
(6)SQLログの出力
イベント検索一覧機能の実装でSQLログの出力方法を紹介しましたので、その他のSQLログの出力方法も紹介しておきます。SELECT分は「selectStatement」で取得することができました。INSERT文は「insertStatement」、UPDATE文は「updateStatement」、DELETE文は「deleteStatement」で取得できます。「Events」オブジェクトに実装すると、次のようになります。
INSERT文のログを出力する
/** 登録 */
def create(e: EventRow) = database.withTransaction { implicit session: Session =>
Logger.debug(Event.insertStatement)
Event.insert(e)
}
UPDATE文のログを出力する
/** 更新 */
def update(e: EventRow) = database.withTransaction { implicit session: Session =>
val q = Event.filter(_.id === e.id)
Logger.debug(q.updateStatement)
q.update(e)
}
DELETE文のログを出力する
/** 削除 */
def delete(id: Int) = database.withTransaction { implicit session: Session =>
val q = Event.filter(_.id === id)
Logger.debug(q.deleteStatement)
q.delete
}
アプリケーションを動かして、SQLを確認してみましょう。ログは「activator run」を実行したコマンドプロンプト上でも確認できますし、「application.log」とうファイル名でプロジェクト配下の「logs」ディレクトリに出力されているログファイルからも確認できます。
例えば、前回作成したイベント登録機能の登録処理を実行すると以下のようなSQLが発行されています。
insert into "TECHAPP"."EVENT" ("EVENT_ID","EVENT_NM") values (?,?)
登録処理でケースクラスは「EventRow(0, form.eventId, form.eventNm)」として作成しました。EventRowの「ID」は自動採番(AutoInc)項目のため、仮の値「0」を設定したのを覚えてますでしょうか? 発行されたSQLを確認すると、上記のように、INSERT文では指定されていないことが分かります。正しく自動採番されていることでしょう。
Play2ではデフォルトのログレベルが「DEBUG」レベルに設定されていますので、上記のように「Logger.debug」で実装したSQLログが出力されました。出力したくない場合は、「application.conf」の「logger.application」に設定してあるログレベルを変更すれば出力を抑制できます。「INFO」レベルに設定したい場合は以下のよう記述します。
application.conf.scala(/conf)
# Logger # ~~~~~ # You can also configure logback (http://logback.qos.ch/), # by providing an application-logger.xml file in the conf directory. # Root logger: logger.root=ERROR # Logger used by the framework: logger.play=INFO # Logger provided to your application: logger.application=INFO
以下の設定を追加することで、Slickのデバッグログを出力することもできます。
logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG
これでイベント管理アプリが完成しました。2回に分けて、Play2とSlickの基本的な使い方を紹介するため、登録・検索・更新・削除を行う最低限の機能だけを実装しました。お気づきのとおり、入力チェックもなければ、処理結果のメッセージ表示もありません。DBトランザクション境界はどこにあって、異常終了した時のテーブルのデータはどうなっているのか? 実際のアプリケーションとして利用するために考慮しておかなければいけないこと、実装しておくべきことはたくさんあります。見た目ももう少し良くしたいですね。今後、そのあたりも少しずつ紹介していきたいと考えています。
最後に、もっとScalaの話が聞きたい、Scalaの話をしてみたいという方にお知らせです。
9月6日、7日の2日間、「Enjoy.scala」をテーマにScalaのカンファレンス「ScalaMatsuri2014」が開催されます。Scala作者であるMartin Odersky教授をはじめ、多くの講演が予定されています。また、企業スポンサーや一般講演枠としてのスピーカーも絶賛募集中です。詳しくは「ScalaMatsuri2014」公式サイトをご覧ください。
なお、今回作成した「イベント管理アプリ」のソースコードはGitHubで公開しています。
次回は、クラウド基盤ソフトウェアであるOpenStackの構築方法について紹介します。



