当表单包含内部大小写时验证 Scala 表单 类

Validate scala forms, when form contains inner case classes

帮助进行 Scala 表单验证,

表单数据的情况class:

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

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

但是如果我们被要求在forms.

中使用mapping和大小写class怎么办?

首先,我将删除 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 方法实现,以便将具有六个字段的表单映射到具有四个字段的模型案例 class。

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

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

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

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