読者です 読者をやめる 読者になる 読者になる

Keep on moving

あんまりまとまってないことを書きますよ

Play2.0でmoreStylesとmoreScriptsの書き方をいろいろ考えてたら、テンプレートの使い方がいろいろわかってきた

id:kiris60 さんの別解的な書き方があるので一応紹介。
でも書くなら kirisさん方式が個人的には一番好きだな。

http://kiris.hatenablog.com/entry/2012/01/26/172446

気づき点(仕様?)

  • Play2.0 or Play1+ScalaのテンプレートはScalaの関数として動作
  • {}の仕様

テンプレートからテンプレートに引数を渡すときに、
中括弧({})で囲むと暗黙的に"play.api.templates.Html"に変換されるっぽい。
"@"をつけてScalaの処理を加えて、明示的に変数化してもplay.api.templates.Htmlになります。

@main("ここは任意の型が使えるが、"){
  <!-- ここはplay.api.templates.Html型になる  -->
}
  • 1系と同様にテンプレートでもエラーがあれば警告してくれます

f:id:Ehren:20120201161330j:image

こんなかんじ(例1 )

@(title: String)(content: Html)(moreStyles: Html)(moreScripts: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">

	    @moreStyles
        <script src="/assets/javascripts/jquery-1.7.1.min.js" type="text/javascript"></script>
	    @moreScripts
    </head>
  ...
@(message: String)

@import tags._

@main("Welcome to Play 2.0") {
    
    @play20.welcome(message)
    
}{
    @styleSheets(
      List(
        ("screen", "stylesheets/main.css")
      )
    )
}{

    @javaScripts(
      List(
        "javascripts/underscore.js",
        "javascripts/underscore.string.js"
      )
    )
}

こんな書き方も可能

カリー化っぽく書くこともできます。

@(title: String)(moreStyles: Seq[(String, String)]=Nil)(moreScripts: Seq[String]=Nil)(content: Html)

@import tags._

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">

        
        @styleSheets(moreStyles)
        <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
@javaScripts(moreScripts)

    </head>
    <body>
        @content
    </body>
</html>
@(message: String)

@import tags._

@main("Welcome to Play 2.0")()(
          List(
        "javascripts/underscore.js",
        "javascripts/underscore.string.js"
        )
    ){
    
    @play20.welcome(message)
    
}

まとめ

Play2系ではビルダがsbtになったお陰でテンプレートコンパイル時のビルド時間が早くなってくれて嬉しい。*1
Play+Scalaで開発するときのサクサク感が1系よりもあがった気がします。

*1:1+Scalaはテンプレートで一文字変更しただけでも結構ビルドに時間がかかる