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でした。


Tags

Scala Tips play framework