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是否相等,检查以确保没有使用用户名,然后发送表单显示两个错误?
这样的事情会更好:
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)
我个人也删除accept从Form本身,而只是阻止用户使用"接受"复选框已被选中之前提交按钮.使用此方法,可以减少引入案例类的垃圾量,并且需要单独使用单独的垃圾.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)