Play frameworkで動的にリンクを作る(for scala)
Posted on 2011-12-26 by y_okayaこんにちは。GTEエソヅニアの岡谷です。
クリスマスはPlay framework(Ver1.2.4)とアツい夜を過ごしたので、その時得た
Tipsをご紹介します。弊社ではScalaが最大勢力のメジャー言語なので、Play frameworkでも
scalaを使ってみようと検証中です。
動的にリンクを作りたいケースがあり、テンプレートに実装していたのですが、Java版で書くと
下記のようなことをScala版でもしようとしました。
<a href="@{Application.show(_post.id)}"><span>link</span></a>
参考URL:Playframework tutorial(Java)
このコードはJava版とScala版のリファレンスを見ると、Scala版にはサンプルコードがないのですが、
見る限りそのまんま使えそうに見えます。
参考URL:Scala templates
しかしながら、Scala版でそのまんま使おうとしたところ使えませんでした。
Application.showのリンク先がこのコードの部分でレンダリングされてしまうのです。
あれー、と思ってplay-scalaのソースをまさぐってみたら下記のコードを見つけました。
views.object in ScalaTemplate.scala
def a(action: => Any)(body: => Html) = Html {
var actionDef = new play.mvc.results.ScalaAction(action).actionDefinition
if(actionDef.method == "GET") {
"""<a href="""" + actionDef.url + """">""" + body + """</a>"""
} else {
val uuid = play.libs.Codec.UUID
"""<a href="javascript:document.getElementById('""" + uuid + """').submit()">""" + body + """</a><form id="""" + uuid + """" action="""" + actionDef.url + """" method="""" + actionDef.method + """"></form>"""
}
}
この機能を使えばうまくいきそうです。
書いてみるとこんな感じですね。
@a(Application.show(_post.id)){
<span>link</span>
}
動かしてみるときちんと動きました。
以上、Play framework(for scala)で動的リンクを作るためのちょっとしたTipsでした。