Play 2 に などの単純なフォーム検証を追加する方法は理解してnonEmptyText
いますが、「少なくとも 1 つのフィールドを定義する必要がある」などのより複雑な検証を実装するにはどうすればよいですか? 現在、モデル オブジェクトがすべてNone
s で初期化されると例外をスローしますが、これは厄介なエラー メッセージを生成します。フォーム ページに分かりやすいエラー メッセージを表示したいと思います。
3 に答える
フォーム定義にmappings
/をネストし、マッピング、サブマッピング、タプル、およびサブタプルに関するルールを追加できます。次に、テンプレートで、特定のフィールドまたはグループのフィールドを使用してエラーを取得できます。tuples
verifying
form.errors("fieldname")
例えば :
val signinForm: Form[Account] = Form(
mapping(
"name" -> text(minLength=6, maxLength=50),
"email" -> email,
"password" -> tuple(
"main" -> text(minLength=8, maxLength=16),
"confirm" -> text
).verifying(
// Add an additional constraint: both passwords must match
"Passwords don't match", password => password._1 == password._2
)
)(Account.apply)(Account.unapply)
)
2つの異なるパスワードを使用している場合は、次を使用してテンプレートのエラーを取得できます。form.errors("password")
この例では、独自に作成して処理する必要がAccount.apply
ありAccount.unapply
ます(String, String, (String, String))
@kheraudの受け入れられた回答を改善しました。タプルを取得して、単一の文字列に戻すことができます。これにより、デフォルトの適用/適用解除機能を使用できます。
例 :
val signinForm: Form[Account] = Form(
mapping(
"name" -> text(minLength=6, maxLength=50),
"email" -> email,
"password" -> tuple(
"main" -> text(minLength=8, maxLength=16),
"confirm" -> text
).verifying(
// Add an additional constraint: both passwords must match
"Passwords don't match", password => password._1 == password._2
).transform(
{ case (main, confirm) => main },
(main: String) => ("", "")
)
)(Account.apply)(Account.unapply)
)
劇中!フレームワークでは、フラッシュ変数を使用してわかりやすいエラーメッセージを表示できます。次のようなものを書く必要があります。
flash.error("Oops. An error occurred");
あなたのコントローラーに。このエラーメッセージがhtmlページのどこにあるかは、たとえば次のように設定する必要があります。
<h1>${flash.error}</h1>
遊ぶ!フレームワークは、この${flash.error}を見つけた場所にエラーメッセージを表示します。