如何在Play框架2中的字段构造函数之外打印验证错误

Tom*_*ant 7 validation scala view playframework playframework-2.0

如何在Play框架2中的字段构造函数之外显示表单字段的验证错误?这是我尝试过的:

@eventForm.("name").error.message
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

value message is not a member of Option[play.api.data.FormError]
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为在api文档中它说消息是FormError的成员.这也适用于全局错误:

@eventForm.globalError.message
Run Code Online (Sandbox Code Playgroud)

wle*_*eao 7

你可以在这里更好地掌握它检查Form的源代码

Form 定义一个apply方法:

 def apply(key: String): Field = Field(
    this,
    key,
    constraints.get(key).getOrElse(Nil),
    formats.get(key),
    errors.collect { case e if e.key == key => e },
    data.get(key))
Run Code Online (Sandbox Code Playgroud)

正如文档中所述,即使它不存在,也会返回任何字段.并且Field有一个errors成员返回Seq[FormError]:

所以,你可以做那样的事情(为了Seq[FormError]):

eventForm("name").errors.foreach { error =>
  <div>@error.message</div>
}
Run Code Online (Sandbox Code Playgroud)

或者(对Option[FormError])

eventForm("name").error.map { error =>
  <div>@error.message</div>
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Form errors:

  def errors(key: String): Seq[FormError] = errors.filter(_.key == key)
Run Code Online (Sandbox Code Playgroud)

并获得给定密钥的所有错误.像这样(为Seq[FormError]):

eventForm.errors("name").foreach { error =>
      <div>@error.message</div>
}
Run Code Online (Sandbox Code Playgroud)

或者(对Option[FormError])

eventForm.error("name").map { error =>
          <div>@error.message</div>
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多详细信息,请查看源代码.它写得很好,评论很好.

干杯!

编辑:

正如biesior评论的那样:要用不同的语言显示人类可读的漂亮信息,你必须检查I18N在这里是如何工作的

要彻底,你可能不得不处理I18N.让一切都运转起来并不难.阅读完文档后,您可能会发现自己有点消耗品.我会给你一点推动.将messages文件添加到您的conf文件夹,您可以从此处复制其内容.这样您就可以更好地控制默认消息.现在,在您看来,您应该能够做到这样的事情:

eventForm.errors("name").foreach { error =>
          <div>@Messages(error.message, error.args: _*)</div>
}
Run Code Online (Sandbox Code Playgroud)

举例来说,如果error.messageerror.invalid它会显示以前定义的消息conf/messages文件Invalid value.args定义您的错误消息可能处理的一些参数.例如,如果您正在处理a error.min,则arg可能是所需的最小值.在您的消息中,您只需遵循{n}模式,其中n是您的参数的顺序.

当然,您可以像这样定义自己的消息:

error.futureBirthday=Are you sure you're born in the future? Oowww hay, we got ourselves a time traveler!
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您可以检查您的表单(只需一行代码就可以向您展示它的感觉)

"year" -> number.verifying("error.furtureBirthday", number <= 2012) // 2012 being the current year
Run Code Online (Sandbox Code Playgroud)

如果您想使用语言,请按照文档进行操作.

干杯,再次!