这是对复杂表单问题的后续处理:How to get child record (case class) ID in Play Framework (2.4.0) using Forms
lazy val aForm = Form(
mapping(
"ID" -> ignored(id),
"firstName" -> nonEmptyText,
"lastName" -> nonEmptyText,
"listOfEmails" -> mapping(
"ID" -> ignored(emailID),
"email" -> email,
"userID" -> ignored(id),
"emailTypeID" -> longNumber)
(UserEmail.apply)(UserEmail.unapply) verifying someConstraint,
"statusID" -> ignored(0l),
"roleID" -> default(longNumber, roleID),
"timezoneID" -> default(longNumber, timezoneID)
(User.apply)
(User.unapply)
)
现在,由于约束在apply
方法之后,我们可以转换case class
并访问它的所有字段,因此我们可以编写一个使用来自任何和所有字段的数据的验证。不确定我是否真的对此感到满意 - 为什么在测试之前转换数据 - 为什么我们不能简单地使用手头的数据进行验证过程?case class
如果它本身由于错误的数据或内部验证过程而在创建过程中出现任何异常,这也会带来一个问题,但这将是一个足够小的极端情况来构建一个变通方案——case class
仅用于验证的自定义。
def someConstraint: Constraint[UserEmail] = Constraint("constraints.unique")({
userEmail =>
match doStuff(userEmail.ID, userEmail.email, userEmail. emailTypeID) {
case BAD => Invalid(Seq(ValidationError("error.unique.email.required")))
case GOOD => Valid
}
}
|)
很抱歉伪代码,但希望您对验证过程中发生的事情有基本的了解。我们获取几个字段并处理它们包含的数据以进行验证判断调用。
事情是这样的。
在 HTML 输出中,嵌套类字段必须引用为:listOfEmails[x].ID
等listOfEmails[x].email
,以便 Play 框架在POST
- https://www.playframework.com/documentation/2.4.0/ScalaForms上正确捕获它们
但是,约束过程listOfEmails[x]
作为错误键的字段名称返回,因此它不会出现在 html 模板上,因为该键不匹配任何内容。
那么如何重命名错误字段键(假设这是正确的答案)或者一个更好的问题是如何使这个过程以端到端的方式进行?
是的,我们可以使用全局错误,但是在一个大而复杂的表单上,我们希望让错误尽可能接近解决方案,以便用户的眼球能够快速识别并继续前进。