[Play]ネストしたFormを使う

playframework2.2でネストしたFormをListで使うサンプルがなかなか見つからなかったのでメモしておきます。

最初にエンティティの定義
今回は簡単にcaseクラスで下記の用に定義します。

case class User(
  userId: String,
  codename: String,  
  skills: List[Skill])
 
case class Skill(skillname:String,level:Int)
 

UserにネストしてSkillを持ちますよ。

controllerでは下記のようにFormのパース定義を記述します。

val userFormDef :Form[User] = Form(
  mapping(
    "userId" -> number,
    "codename" -> text,            
    "skills" ->  list[Skill](
      mapping(
        "skillname" -> text,
        "level" -> number
      )(Skill.apply)(Skill.unapply))                      
  )(User.apply)(User.unapply))

エンティティのネストと同様にFormの定義もネストして記述しています。

これを受けるビューはこんな感じで記述
@(form:Form[User])(implicit request: RequestHeader)
<!DOCTYPE html>
・・省略・・
<h2>UserID: @form.get.userId <h2>
@helper.inputText(form("codename"))<br />

@helper.repeat(form("skills"), min = 1) { skill =>
<div>
  @helper.inputText(skill("skillname"))
  @helper.inputText(skill("level"))
</div>
}

</html>

念のため表示させる時のコードも書いておきます

val user = User(・・・・・)
Ok(views.html.user(userFormDef.fill(user)))

パースさせる時も普段どおりこんな感じでOkす

userFormDef.bindFromRequest.fold(
      formWithErrors => BadRequest,
      form => {
	・・・
      })

以上、参考になれば。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です