Play Framework 2 テンプレート言語は非常に優れています。ただし、これは Microsoft の Razor 言語に「触発された」ものですが、1 つの重要な設計上の決定が異なります。それは、HTML に「エスケープ」する方法です。Razor は HTML スタイルのタグを探し、Play 2 はある種のヒューリスティックを使用します。
HTML の複数の「セクション」を取り、ヘッダーと目次を含むページを生成するテンプレートを作成しようとしています。私の「structuredpage.scala.html」は次のようになります。
@(title: String)(sections: Pair[String,Html]*)
@main(title){
<nav class="page-links">
@makeTableOfContents(sections)
</nav>
@for(section <- sections){
<section id="@section._1">
<h2>@section._1</h2>
@section._2
</section>
}
}
その 2 番目のパラメーターは可変数のセクションであることに注意してください。Play テンプレート言語でこれを呼び出す方法はないようです。
Common.section
次のようなヘルパー関数を作成しました。
def section(title: String)(content: Html) = title -> content;
私はこれを試しました:
@()
@import views.Common.section
@structuredpage("Dashboard")(
section("Latest Requests") {
<p>Blah</p>
},
section("Your Details") {
<p>Blah blah</p>
}
)
…これはtype mismatch; found : scala.xml.Elem required: play.api.templates.Html
5 行目に表示されます。つまり、<p>Blah</p>
テンプレート ドキュメント HTML としてではなく、Scala として解釈されています。
この:
@()
@import views.Common.section
@structuredpage("Dashboard"){
@section("Latest Requests") {
<p>Blah</p>
},
@section("Your Details") {
<p>Blah blah</p>
}
}
…これはtype mismatch; found : play.api.templates.Html required: (String, play.api.templates.Html)
3 行目に表示されます。つまり、外側の中かっこブロック全体が、Scala コードではなく、テンプレート ドキュメント HTML として解釈されています!
イライラすることに、それらは Play 2 の公式ドキュメントの一部のコード サンプルと大きく異なるようには見えません。
何か案は?Play Framework 2.0.4 を使用しています