Play Framework 2字段分组

时间:2014-06-11 17:49:22

标签: scala playframework-2.2

我有一个"组"以下输入:

  • 文字输入1
  • 文字输入2
  • 复选框

始终需要文本输入1。仅在选中复选框时才需要文本输入2。如何通过游戏实现此类验证?目前我有这样的事情:

val myForm: Form[MyData] = Form(
  mapping(
    "text1" -> text.verifying("Text1 is required", !_isEmpty),
    "text2" -> text.verifying("Text2 is required", !_isEmpty),
    "check" -> boolean
)

但显然这不是我想要的,因为总是需要text2。有没有办法组合这个来实现这种相互依赖的验证?

根据小麦建议更新 这个解决方案有效,但它有一些我需要克服的怪癖:

  1. 在表单中的所有其他约束都通过之前,临时验证不会发生。如果其他约束失败,则ad-hoc验证甚至不会执行。我需要它们一起执行所以我可以在表单上显示所有错误消息。
  2. 在此临时验证期间分配的错误不适用于特定表单输入,例如文本2。在我的模板中,我需要在text2上显示一条错误消息,例如("因为您选中了复选框,您需要填写此输入")。相反,错误只是一般的"形式级别"错误。您可以想象我将有多个此类验证的实例,因此我可以假设此错误适用于text2。
  3. 我查看了该剧支持的自定义验证器,但我看不出如何使用它们来跨多个字段进行操作。 The example they show仅应用正在验证的表单字段,但没有明显的方法来引用表单中的其他输入。

1 个答案:

答案 0 :(得分:1)

您可以从文档中看到它们允许对您创建的表单对象进行临时验证(请参阅documents。)您可以做的是制作验证器:

 def validate(text1: String, text2: String, check: Boolean) = if(check) text2.nonEmpty else true

 val myForm: Form[MyData](
   mapping("text1" -> text.verifying("Text1 is required", !_isEmpty))
 )(MyData.unapply)(MyData.apply) verifying ("Text2 is required if check box checked", {
   case data => validate(data.text2, data.check)
 })

应该可以提供你想要的东西,但我也会查看他们的custom validators部分(因为他们建议这是一个很好的路线。)