Scala Templateから直接関数を呼び出して定数に格納

Scala Templateから直接関数を呼び出して定数に格納

弊社のENishi環境は、Play2.0で動いています。
WEBアプリケーションフレームワークとしては、私はPHPとSmartyとASP.netしか使ったことがないので微妙ですが、Play2.0のViewを担っているScalaTemplateで感動した部分を挙げていこうと思います。

素敵だと思うのが、

  • ViewからControllerやModelで定義した関数を呼び出せること
  • しかも、valみたいにテンプレートに定数として関数の結果をもつこともできちゃう

でしょうか。

DBからユーザーとってきて表示するコードを例に見てみます。
比較対象がSmartyしかないのですが、Smartyだと、ControllerからViewに値を渡すときには、このように書かないといけません。


//Controller sample.php
$user_rows = models.Users.getAllUsers();
$view->assign("user_rows", $user_rows);
$view->display('sample.tpl');
//View sample.tpl
{foreach from=$user_rows item=row}
{$row.family_name}{$row.first_name}
{/foreach}

ScalaTemplateで書くと、通常は、こう。


//Controller sample.scala
val user_rows = models.Users.getAllUsers()
Ok(views.sample(user_rows))
//View sample.scala.html
@(user_rows: List[(User))
@for(u <- users){
@u.family_name @u.first_name
}

・・・・・・あんまり変わんないじゃん( ゜Д゜)

いや、ちょっと待って。こういう書き方もできちゃうみたいですよ。
Controllerからの値受け渡しをなくしてやってみます。


// Controller sample.scala
Ok(views.sample())
// View sample.scala.html
@import models._
@for(u <- Users.getAllUsers()){
@u.family_name @u.first_name
}

Controllerの記述が丸ごとなくなりました。上記のサンプルは変数が少ないので実感しづらいですが、変数が増えるだけ、コード量がすっきりしてくるのかなと思います。

関数名が長くなったり、複数個所で使うようなら、View上にDefiningで別名定義もできます。


// View sample.scala.html
@import models._
//UserEditAuthority.getAllUsersAuthority()をauthとして扱う
@defining(UserEditAuthority.getAllUsersAuthority()) { auth =>
@for(a <- auth){
@a.name
} }

こういうのもできますね。VIEW上でユーザー名のひらがなをそれぞれアルファベットに変換して表示するメソッドを呼び出します。


// View sample.scala.html
@import models._
@for(u <- Users.getAllUsers()){
  Controllers.Utils.replaceHiraganaToAlphabet(u.name_kana)
}

似たようなやり方で、別クラス定義した共通ValをViewから直接呼び出すこともできます。

あんまりこういう書き方すると、デザイナとの調整が煩雑になったりコードのメンテナンス性が落ちたりする部分があると思うので使いどころは選びますが、選択肢の一つとしてあるだけでかなり頼もしいですね。

こんな記事も読んでいただいています

Scalaエンジニアの求人