技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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