Scala Play 2.x(5) Scala Templatesとビュー&フォーム操作

なんか首が痛いのは、誰かに「トン」てやられて気絶してたからじゃないかと思ったけど、結局は日焼けでした。

あいも変わらずこれのハンズオンです。

Scala Templatesの場合はHTMLとScalaのコードを組み合わせて記述し、「scala.html」という拡張子を持ちます。 

 みたことあるけど、長い拡張子ですな。

Scala Templatesの特徴は3つ挙げられてるけどその中でも

【3】Type SafeなTemplateエンジン

が一番すきなところです。コンパイルタイムで弾けるのはいいよね。 

で、まずはじめにscala templatesから。app/viewsの下に作成した.scala.htmlファイルはviews.htmlの下のオブジェクトとなるので、例えばapp/views/list.scala.htmlを作成した場合、呼び出すのはviews.html.list(...)と書いてるのは、サンプルではviews.html.show(...)となっていてエラーになったため。まあ、それまでの説明呼んでればすぐわかることでしょう。

で、.scala.htmlファイルでは@からscalaとして解釈されるらしく、

冒頭の@(引数)でcontrollerから渡ってくる引数の宣言。@main(...){でapp/views/main.scala.htmlの読み込みなど。また、@for(user <- list){でイテレーションが可能。あと、タグという個別のHTMLフラグメントも作成可能。要するに@mainみたいな呼び出しで細分化可能と。

次、Form。Formにバインディングするためまずはmodelの作成。models packageにmodels.scalaを作り、

caseclassUser(name:String, email:String, age:Int)

 こうしたのだが、この後のコードでType Mismatchエラーが発生してしまったので、age: Intを削除した。

で、UserControlelrオブジェクトを作成し、Form定義が

val userForm =Form(
mapping(
"name"-> text,
"email"-> text)(User.apply)(User.unapply)) 

登録画面が

def entryInit =Action{
val filledForm = userForm.fill(User("user name","email address"))
Ok(views.html.user.entry(filledForm))

 登録実行が

def entrySubmit =Action{implicit request =>
val user = userForm.bindFromRequest.get
println(user)
Ok(views.html.user.entrySubmit())
}

 という感じです。あとめんどいのは登録画面だけどhelper関数でこう

@(userForm:Form[User])
@import helper._
@main("entry user"){
<h1>Entry user</h1>
@helper.form(action = routes.UserController.entrySubmit) {
<fieldset>
<legend>input user info.</legend>
@helper.inputText(userForm("name"))
@helper.inputText(userForm("email"))
</fieldset>
<input type="submit" value="entry">
}
}

 この感じはどこだったかな。。。どっかでみたhelperみたいだ。まあありがちだけど。

ただ、このhelperが秀逸なのは次のvalidationの対応も含んでいること。

validationはForm定義のところを

 val userForm =Form(
mapping(
"name"-> nonEmptyText,
"email"-> email)(User.apply)(User.unapply)) 

と"nonEmptyText"や"email"などの指定が可能。くわしくは

これ以外にも多数のバリデート処理がありますので、APIドキュメントで確認してみてください。 

とのこと。あとはuserForm.bindFromRequest.foldで分岐処理してあげればOK(これまで引用すると丸パクリになるのでやめた)

これだけでvalidation処理はもちろん、エラー表示までやってくれます。

今日は遅いので以上となります。