10

Play 2 に などの単純なフォーム検証を追加する方法は理解してnonEmptyTextいますが、「少なくとも 1 つのフィールドを定義する必要がある」などのより複雑な検証を実装するにはどうすればよいですか? 現在、モデル オブジェクトがすべてNones で初期化されると例外をスローしますが、これは厄介なエラー メッセージを生成します。フォーム ページに分かりやすいエラー メッセージを表示したいと思います。

4

3 に答える 3

9

フォーム定義にmappings/をネストし、マッピング、サブマッピング、タプル、およびサブタプルに関するルールを追加できます。次に、テンプレートで、特定のフィールドまたはグループのフィールドを使用してエラーを取得できます。tuplesverifyingform.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))

于 2012-05-11T19:41:43.847 に答える
7

@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)
)
于 2013-01-09T19:56:13.973 に答える
0

劇中!フレームワークでは、フラッシュ変数を使用してわかりやすいエラーメッセージを表示できます。次のようなものを書く必要があります。

flash.error("Oops. An error occurred");

あなたのコントローラーに。このエラーメッセージがhtmlページのどこにあるかは、たとえば次のように設定する必要があります。

<h1>${flash.error}</h1>

遊ぶ!フレームワークは、この${flash.error}を見つけた場所にエラーメッセージを表示します。

于 2012-05-11T13:19:21.493 に答える