Form を使う
Playframework にはPOSTデータ等を簡単にバリデーション、及びオブジェクトマップする方法があります。
先ずは簡単にフォームを使いましょう。
import play.api.data._ import play.api.data.Forms._ val loginForm = Form( tuple( "email" -> text, "password" -> text ))
これは
// マップを直接弄ったり
val anyData = Map("email" -> "bob@gmail.com", "password" -> "secret")
val (user, password) = loginForm.bind(anyData).get
// request を暗黙で取り込んで下記のように使えます
val (user, password) = loginForm.bindFromRequest.get他に、オブジェクトマッピングに
import play.api.data._ import play.api.data.Forms._ case class User(name: String, age: Int) val userForm = Form( mapping( "name" -> text, "age" -> number )(User.apply)(User.unapply))
また、バリデーション機構もあります
val userForm = Form(
mapping(
"name" -> text.verifying(nonEmpty),
"age" -> number.verifying(min(0), max(100))
)(User.apply)(User.unapply))
// 使い方
loginForm.bindFromRequest.fold( formWithErrors =>BadRequest(views.html.login(formWithErrors)),
value =>Redirect(routes.HomeController.home).flashing("message" -> "Welcome!" + value.firstName))カスタムなバリデーションを挟むことも可能です
val userCreateForm = Form(
tuple(
"account" -> nonEmptyText(5, 16),
"pass" -> nonEmptyText(5, 16),
"pass2" -> nonEmptyText(5, 16),
"accept" -> checked("Please accept the terms and conditions")
) verifying(Messages("form.user.create.pass.not_match"), fields => fields match {
case (ac, pas, pas2, accept) => {
pas == pas2
}
})
)