播放2.3 scala表单 - 如何自定义约束消息

时间:2015-10-01 10:07:21

标签: forms scala playframework constraints customization

我在游戏框架中创建了带约束的表单:

val voucherForm = Form(
  mapping(
    "voucherName" -> nonEmptyText,
    "voucherCode" -> optional(text(minLength = 6).verifying(pattern("""[a-zA-Z0-9]+""".r, error = "...")))     
  )(VoucherForm.apply)(VoucherForm.unapply)
)

当我在网页上显示此表单时,我在输入框附近显示了约束消息(如RequiredMinimum length: 6, constraint.pattern)。

我想为每个输入字段自定义此约束消息(即,相同形式的两个nonEmptyText约束将具有不同的约束消息)。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

这些消息来自消息。您可以创建自定义消息文件并将自定义文本放在那里。浏览源代码以检查放在那里的有效字符串是什么。

例如nonEmptyText声明如下:

val nonEmptyText: Mapping[String] = text verifying Constraints.nonEmpty

从那里,Constraints.nonEmpty看起来像这样:

  def nonEmpty: Constraint[String] = Constraint[String]("constraint.required") { o =>
    if (o == null) Invalid(ValidationError("error.required")) else if (o.trim.isEmpty) Invalid(ValidationError("error.required")) else Valid
  }

所以错误字符串是"error.required"

现在你可以在conf目录中创建一个文件messages并放一行

error.required=This field is required

ValidationError的{​​{1}}方法声明如下:

apply

这意味着您也可以在def apply(message: String, args: Any*) 中传递参数,您可以使用messages语法

来访问它们

例如,如果你创建了这样的错误

{arg_num}

将以有界形式返回,然后播放将使用val format = ??? ValidationError("error.time", someFormat) 查找名为“error.time”的消息并相应地格式化,例如,您可以创建如下消息:

MessagesApi

我想为每个字段设置自定义消息是一种自定义方法,如下所示:

error.time=Expected time format is {0}
如果你想要使用许多有限制的孩子,

可能不是一个理想的解决方案。

答案 1 :(得分:2)

您可以不使用text,而是将自定义消息放在verifying中,而不是使用nonEmptyText:

val voucherForm = Form(
  mapping(
    "voucherName" -> text.verifying(
      "Please specify a voucher name", f => f.trim!=""),
...