Play で Scalate を使う
play-scalate っていう名前のプラグインはいろんな人が書き散らかしてて github 検索するとボロボロ出てくるんですが、ついうっかり仲間に加わってしまいました。
https://github.com/tototoshi/play-scalate
build.sbt に設定すれば
libraryDependencies ++= Seq( "com.github.tototoshi" %% "play-scalate" % "0.1.0-SNAPSHOT", "org.scalatra.scalate" %% "scalate-core" % "1.7.0", "org.scala-lang" % "scala-compiler" % scalaVersion.value ) unmanagedResourceDirectories in Compile += baseDirectory.value / "app" / "views"
こんな感じで使えます。
package controllers import play.api._ import play.api.mvc._ import com.github.tototoshi.play2.scalate._ object Application extends Controller { def index = Action { implicit request => Ok(Scalate.render("index.jade", Map("message" -> "hello"))) } }
ライブラリという形にして、SNAPSHOT を publish はしたけれど、そんな大したものではないのでいじりたければプロジェクト内にコピペして好きにいじってもらえばいいかなと思います。
Play で Scalate を使うときに気をつけることは、Dev モードで普通に動いてるのに Prod モードだと動かん!ってことにならないように、テンプレートファイルをファイルとしてではなくリソースとして読み込めってこどでしょうか。つまり、Play.api.current.getFile
じゃなくて Play.api.current.resourceAsStream
とか使おうってことです。Scalate はファイルを読み込むのを想定しているので、リソースを読み込むようにするのに一手間必要です。
Play ではリソースファイルは conf/
に置くことになってる(ちょっと気持ちわるい)ために
app/views
のファイルはリソースとして扱われないので、デプロイしたときにリソースが見つからん!というエラーも起きます。これを防ぐためにはテンプレートファイルは、app/views
ではなく conf/views
に置くか、conf
以下から app/views
にシンボリックリンクを...っていやまさか、
build.sbt で
unmanagedResourceDirectories in Compile += baseDirectory.value / "app" / "views"
とすれば良いです。