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

时间:2012-12-22 17:49:28

标签: validation scala view playframework playframework-2.0

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

@eventForm.("name").error.message

我收到了这个错误:

value message is not a member of Option[play.api.data.FormError]

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

@eventForm.globalError.message

2 个答案:

答案 0 :(得分:7)

您可以更好地掌握它Form's sourcecode here

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

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

所以,你可以这样做(对于Seq[FormError]):

eventForm("name").errors.foreach { error =>
  <div>@error.message</div>
}

或(对于Option[FormError]

eventForm("name").error.map { error =>
  <div>@error.message</div>
}

或者,您可以使用Form errors

  def errors(key: String): Seq[FormError] = errors.filter(_.key == key)

获取给定密钥的所有错误。像这样(对于Seq[FormError]):

eventForm.errors("name").foreach { error =>
      <div>@error.message</div>
}

或(对于Option[FormError]

eventForm.error("name").map { error =>
          <div>@error.message</div>
}

如果您想了解更多详情,请查看源代码。它编写得很好,评论很好。

干杯!

修改

正如biesior评论的那样:要显示不同语言的人类可读漂亮的消息,你必须检查游戏是如何工作的{IHN here

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

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

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

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

error.futureBirthday=Are you sure you're born in the future? Oowww hay, we got ourselves a time traveler!

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

"year" -> number.verifying("error.furtureBirthday", number <= 2012) // 2012 being the current year

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

再次干杯!

答案 1 :(得分:3)

正如您所说,messageFormError的成员,但您有Option[FormError]。你可以用

eventForm("name").error.map(_.message).getOrElse("")

如果出现错误,则会显示消息;如果没有,则显示""