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 } }) )