0

我很新玩和斯卡拉。我正在处理表单和验证。但我无法弄清楚从表单上的多次验证中得到所有错误。

我的表单元组看起来像;

val companyMapping = Forms.tuple(
    "name" -> nonEmptyText,
    "email" -> email,
    "password" -> nonEmptyText(8),
    "re-password" ->nonEmptyText(8)).verifying(
        // Add an additional constraint: both passwords must match
        "Passwords don't match", data => {
        data._3 == data._4  }
    ).verifying(
        // Second constraint
        "Test error", data => {
            false  }
    )

在我打印全局错误和错误的视图中,它看起来像;

@println(companyForm.globalError)
@println(companyForm.errors)

和输出;

Some(FormError(,Passwords don't match,WrappedArray()))
List(FormError(,Passwords don't match,WrappedArray()), FormError(,Test error,WrappedArray()))

在这个阶段,我完全不知道如何打印这两个错误。我为每个输入分别显示错误并在最后显示全局错误。但是如果密码匹配,我可以在全局错误中看到测试约束。除了它只显示密码匹配约束。

这是视图部分;

@helper.form(action = routes.Login.register) {

        <div class="row">
            <span class="label">Name</span>
            <input type="text" name="name" placeholder="Company Name" value="@companyForm("name").value" >
            @if(!companyForm.errors("name").isEmpty){

                <span class="error">@Messages(companyForm.errors("name")(0).message,"Company name")</span>
            }
        </div>

        <div class="row">
            <span class="label">Email</span>
            <input type="text" name="email" placeholder="Email" value="@companyForm("email").value" >
            @if(!companyForm.errors("email").isEmpty){
                <span class="error">@Messages(companyForm.errors("email")(0).message,companyForm.errors("email")(0).key)</span>
            }

        </div>

        <div class="row">
            <span class="label">Password</span>
            <input type="password" name="password" placeholder="Password" value="@companyForm("password").value" >
            @if(!companyForm.errors("password").isEmpty){
                <span class="error">@Messages(companyForm.errors("password")(0).message,8)</span>
            }
        </div>

        <div class="row">
            <span class="label">Re-type Password</span>
            <input type="password" name="re-password" placeholder="Re-type your password" value="@companyForm("re-password").value" >
            @if(!companyForm.errors("re-password").isEmpty){
            <span class="error">@Messages(companyForm.errors("re-password")(0).message,8)</span>
            }
        </div>
                   @println(companyForm.globalError)
                   @println(companyForm.errors)
        <div class="row">
            <span class="label"><button type="submit">Save</button></span>
            @companyForm.globalError.map { error =>
               <span class="error">@error.message</span>
            }
        </div>

     }

也许我只是对这些错误类型感到困惑。所以请你详细解释一下。

4

1 回答 1

1

re-password您的模板部分,您当前测试是否!companyForm.errors("re-password").isEmpty但仅显示消息companyForm.errors("re-password")(0),即仅显示第一个错误。即使您有多个错误。

您必须迭代companyForm.errors("re-password")以打印每个错误的内容。

<span class="error">...例如,您可以使用 for 理解为每个错误输出一个:

<div class="row">
    <span class="label">Re-type Password</span>
    <input type="password" name="re-password" placeholder="Re-type your password" value="@companyForm("re-password").value" >
    @for (error <- companyForm.errors("re-password")) {
    <span class="error">@Messages(error.message,8)</span>
    }
</div>

有关在模板中使用的其他有用语法,请参阅play doc 。Scala templates

于 2013-07-25T15:37:31.750 回答