如何在Play中一次验证多个表单字段?

Kor*_*ory 2 forms validation playframework playframework-2.3

所以我有一个表单对象:

  object RegisterForm {
   case class registerFormData(
      name: String,
      email: String,
      repeatemail: String,
      password: String,
      repeatpassword: String,
      timezone: Option[Int],
      dob: Int,
      accept: Boolean
  )
  val registerForm: Form[registerFormData] = Form(
    mapping(
      "name" -> nonEmptyText,
      "email" -> nonEmptyText,
      "repeatemail" -> nonEmptyText,
      "password" -> nonEmptyText,
      "repeatpassword" -> nonEmptyText,
      "timezone" -> optional(number),
      "dob" -> number,
      "accept" -> checked("Please accept the terms and conditions.")
    )(registerFormData.apply)(registerFormData.unapply)
  )
}
Run Code Online (Sandbox Code Playgroud)

我可以像在Play中使用Java一样验证多个字段吗?

例如,我可以验证检查密码和repeatpassword是否相等,检查以确保没有使用用户名,然后发送表单显示两个错误?

Mic*_*jac 5

这样的事情会更好:

case class User(
   name: String,
   email: String,
   password: String,
   timezone: Option[Int],
   dob: Int,
   accept: Boolean
)

val registerForm: Form[User] = Form(
    mapping(
      "name" -> nonEmptyText,
      "email" -> tuple(
          "main" -> nonEmptyText,
          "confirm" -> nonEmptyText
      ).verifying(
           "Emails don't match", email => email._1 == email._2
      ).transform[String](
          email => email._1,      // Transform to a single field
          email => (email, email) // Reverse transform from a single field to multiple
      ),
      "password" -> tuple(
          "main" -> nonEmptyText,
          "confirm" -> nonEmptyText
      ).verifying(
           "Passwords don't match", password => password._1 == password._2
      ).transform[String](
          password => password._1,
          password => ("", "")
      ),
      "timezone" -> optional(number),
      "dob" -> number,
      "accept" -> checked("Please accept the terms and conditions.")
    )(User.apply)(User.unapply)
)
Run Code Online (Sandbox Code Playgroud)

我个人也删除acceptForm本身,而只是阻止用户使用"接受"复选框已被选中之前提交按钮.使用此方法,可以减少引入案例类的垃圾量,并且需要单独使用单独的垃圾.HTML中的表单字段如下所示:

Email: <input type="text" name="email.main">
Confirm Email: <input type="text" name="email.confirm">
Run Code Online (Sandbox Code Playgroud)

您还可以使用verifying内的检查Form,如果用户名或电子邮件地址已在使用,但我会保存为以后Form成功结合.

如果您有User.findByEmail(string)返回的函数Option[User],则可以添加到以下内容中的电子邮件字段Form:

.verifying("Email address is already in use", email => User.findByEmail(email).isEmpty)
Run Code Online (Sandbox Code Playgroud)