如何在Play 2中指定复杂的表单验证?

时间:2012-04-26 22:12:51

标签: scala playframework playframework-2.0

我理解如何在Play 2中添加简单的表单验证,例如nonEmptyText,但是如何实现更复杂的验证,例如“必须至少定义一个字段”?现在我在我的模型对象中抛出一个异常,如果它被所有None s初始化,但这会产生一个讨厌的错误消息。我希望在表单页面上收到一条友好的错误消息。

3 个答案:

答案 0 :(得分:9)

您可以在表单定义中嵌套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)
)

如果您有两个不同的密码,则可以使用form.errors("password")

在模板中检索错误

在此示例中,您必须编写自己的Account.applyAccount.unapply来处理(String, String, (String, String))

答案 1 :(得分:7)

我已经改进了@ kheraud接受的答案。您可以将元组转换回单个字符串。这允许您使用默认的apply / unapply函数。

示例:

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

答案 2 :(得分:0)

在游戏中!框架,您可以通过使用flash变量显示友好的错误消息。你只需要写一些像;

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

到您的控制器。此错误消息将驻留在html页面上的位置应设置为例如;

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

播放!框架会将错误消息放在找到$ {flash.error}的东西。