技術をかじる猫

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

フォームエラーをまとめて表示したい

Playframework2.1.1 のフォームに値をバインドし、エラーを表示する際に、エラーのみを一覧表示で取得したい場合がある。
その方法を探してみた。(そのまま今作ってるやつ)

  val userCreateForm = Form(
    tuple(
      "account" -> nonEmptyText(6, 16).verifying(Messages("form.user.create.account.already.used"), constraint => !Login.exists(constraint)),
      "pass" -> nonEmptyText(5, 16),
      "pass2" -> nonEmptyText(5, 16),
      "accept" -> checked(Messages("form.user.create.accept.not_checked"))
    ) verifying(Messages("form.user.create.pass.not_match"), fields => fields match {
      case (ac, pas, pas2, accept) => {
        pas == pas2
      }
    })
  )

/* 利用箇所で */
  def formError2String(formError:FormError)(implicit lang:Lang):String = {
    formError.key match {
      case null | "" => Messages(formError.message, formError.args:_*)
      case key => "%s : %s".format(key, Messages(formError.message, formError.args:_*))
    }
  }

  userCreateForm.bindFromRequest().fold(
    hasErrors => hasErrors.errors.map(formError => formError2String(formError)).toList,
    success => /* 略 */

フォームにバインドした際のエラーは、Form 型の中の、errors フィールドに Seq[play.api.data.FormError] で入っていることが分かった。
play.api.data.FormError型はレンダリングに必要なキー、メッセージ、メッセージに埋め込む引数となっているので formError2String を定義してエラーを文字列に変換する。
これで、フォームエラーメッセージを一括で取得することができる。