フォームエラーをまとめて表示したい
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 を定義してエラーを文字列に変換する。
これで、フォームエラーメッセージを一括で取得することができる。