【问题标题】:Validate scala forms, when form contains inner case classes当表单包含内部案例类时,验证 scala 表单
【发布时间】:2015-08-14 12:01:00
【问题描述】:

帮助 Scala 表单验证,

这是表单数据的案例类:

  case class Data(
    firstName: String,
    lastName: String,
    email: String,
    confirm_email: String,
    password: String,
    confirm_password: String)
}

还有 Scala 形式:

  val form = Form(
    mapping(
      "firstName" -> nonEmptyText,
      "lastName" -> nonEmptyText,
      "email" -> email,
      "confirm_email" -> email,
      "password" -> nonEmptyText(minLength = 8),
      "confirm_password" -> nonEmptyText(minLength = 8))(Data.apply)(Data.unapply))

现在问题是我们需要验证“电子邮件”和“确认”电子邮件,但问题是我们需要创建tuplesmapping。那么处理这些表单验证情况的最佳方法是什么。只需使用元组而不将其映射到任何案例类即可轻松完成。

但是,如果我们被要求使用mappingforms 中的案例类,该怎么办。

【问题讨论】:

    标签: forms scala validation playframework-2.0


    【解决方案1】:

    首先,我会删除 confirm_emailconfirm_password 字段,因为它们在 Data 模型中是多余的。完成此操作后,它将如下所示:

    case class Data(
      firstName: String,
      lastName: String,
      email: String,
      password: String)
    

    接下来,您的表单映射需要更新:

    val form = Form[Data](
      mapping(
        "firstName" -> nonEmptyText,
        "lastName" -> nonEmptyText,
        "email" -> tuple(
          "email1" -> email,
          "email2" -> email
        ).verifying(Messages("form.error.emailNotEquals"), email => email._1 == email._2),
        "password" -> tuple(
          "pass1" -> nonEmptyText(minLength = 8),
          "pass2" -> nonEmptyText(minLength = 8)
        ).verifying(Messages("form.error.passwordNotEquals"), password => password._1 == password._2)
      )((firstName, lastName, email, password) => Data(firstName, lastName, email._1, password._1))
       ((form: Data) => Some((form.firstName, form.lastName, (form.email, form.email), ("", ""))))
    )
    

    需要进行两项更改:

    • 对电子邮件和密码字段进行验证的嵌套映射。
    • 自定义applyunapply方法实现,以便将具有六个字段的表单映射到具有四个字段的模型案例类中。

    请注意,自定义 unapply 方法不会为密码字段设置值,因为它几乎在所有情况下都是所需的行为。

    最后,必须更改您的视图以正确引用新的表单元组映射。例如,电子邮件字段应如下所示:

    @helper.inputText(dataForm("email.email1"))
    @helper.inputText(dataForm("email.email2"))
    

    不使用新元组映射的字段保持不变。

    【讨论】:

    • 感谢丹尼尔,但我收到此错误:[error] signature: Some.apply[A](x: A): Some[A] [error] given arguments: form.firstName, form.lastName, scala.Tuple2(form.email, form.email), scala.Tuple2("", "") [error] after adaptation: Some((form.firstName, form.lastName, scala.Tuple2(form.email, form.email), scala.Tuple2("", "")): (String, String, (String, String), (String, String))) [error] ((form: Data2) => Some(form.firstName, form.lastName, (form.email, form.email), ("", "")))
    • 得到了问题:在表格的最后一行,((form: Data) => Some(....)) 应该被替换为((form: Data) => Some((....))),即额外的()。如果您可以对答案进行必要的更改,请将您的答案标记为正确
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多