知っている人には常識なのかもしれないけど知らなくてかなりハマった playframework 2.4 で main.scala.html に渡すパラメータを増やす方法。もっとスマートな方法を知っている人がいたら補足ください。
デフォルト値を指定して呼び出し互換性を保つこと!
main.scala.html は <html>
〜</html>
を既述してサイト全体で共通化されたレイアウトを実装する目的で使われます。要はここでヘッダやフッタ、左右のカラムなどが配置するわけですが、状況によってそれらの一部を変更したいことがしばしばあります。例えば「ログイン中であれば右上にログアウトボタンを出す」などですね。
この場合、単純に main.scala.html のパラメータを増やすだけではエラーになってしまいます。
@(title: String, uid:Option[String])(content: Html)
@main()
に新しく追加した UID を渡しているにも関わらず:
not enough arguments for method apply: (title: String, uid: Option[String])(content: play.twirl.api.Html)play.twirl.api.HtmlFormat.Appendable in class main. Unspecified value parameter uid.
と出力されています。エラーの指摘場所も宣言部分に見えますね。
これは以下のように追加分のパラメータにデフォルト値を定義することで回避することができます。
@(title: String, uid:Option[String] = None)(content: Html)
この挙動からの憶測になりますが、playframework はエラーページの表示などの目的で内部的に main.scala.html
を参照しているため、パラメータ追加の変更に耐えられないのが原因なんだろうと思います。なのでデフォルト値を指定して呼び出し互換性を維持してやらないといけないんでしょうね。
しかしこの手の TIP はドキュメントのどこに書いてあるんだろ…