play-clojureその2(ビューでScalaテンプレートを利用する)


Play framework Advent Calendar 2014の20日目です。

昨日のplay-clojure(Play 2アプリをclojureでつくる)その1に続き、play-clojureネタです。
エントリーがないのでそのまま続けてしまっています。

今日はビューテンプレートを表示してみます。
Playのビューは、Scalaテンプレートと呼ばれる仕組みを使っており、Twirlという名前で呼ばれています。

昨日のエントリーでは、単に文字列をResultとして返すだけのアプリケーションでした。ということで、Scalaテンプレートを適用してみましょう。

昨日のプロジェクトをコピーして、play-clojure-example-viewというプロジェクトを作ってみます。

1. ビューテンプレートの用意

まずは、ビューテンプレートを作成します。

app/views/MyControllerというディレクトリを作成し、index.scala.htmlという名前で下記のテンプレートを用意します。

@(message:String)

Clojure view @message is OK.

これは、単に一つの引数を持つだけのシンプルなテンプレートです。

2. コントローラにアクションを追加

続いて、コントローラの拡張です。
app/clojure/controllers/myController.cljを下記のように書き換えてみましょう。

(ns controllers.myController
  (:import (play.mvc Results)
           (views.html.MyController index))
  (:gen-class
    :methods [#^{:static true} [index [] play.mvc.Result]
              #^{:static true} [view  [] play.mvc.Result]]
    :extends play.mvc.Controller))

(defn -index []
  (Results/ok "Hello world from Clojure!!"))

(defn -view []
  (Results/ok (index/render "TEST")))

変更になった点は、ビューテンプレートのクラスをインポートしている下記の部分

(ns controllers.myController
  (:import (play.mvc Results)
           (views.html.MyController index))

と、新しいviewという関数をstaticメソッドとして出力する部分

  (:gen-class
    :methods [#^{:static true} [index [] play.mvc.Result]
              #^{:static true} [view  [] play.mvc.Result]]
    :extends play.mvc.Controller))

それと、実際のアクション定義となります。

(defn -view []
  (Results/ok (index/render "TEST")))

ちなみにJavaでこのアクション定義を書くとこんな感じになります。

public static Result index() {
        return ok(views.html.MyController.index.render("TEST"));
}

ルーティングの定義

続いて、ルーティングも追加します。
conf/routesに下記を追記しましょう。

GET        /clj                 controllers.myController.view()

これで、http://localhost:9000/cljでアクセスすると「Clojure view TEST is OK.」と表示されるようになりました。

…僕の環境では。おそらくリポジトリからクローンして実行するとコンパイルエラーとなるかと思います。
原因は、clojureがコンパイルされる際に、まだビューのコンパイルが終わっていない状態にあり、それで「 java.lang.ClassNotFoundException」が出力されてしまうのです。

うーむ。。sbtでなにかしないといけないのでしょうか。

以下のリポジトリにて、これらのサンプルは公開しています。

karad/play-clojure
https://github.com/karad/play-clojure

Comments are closed.