【发布时间】:2013-02-17 09:28:37
【问题描述】:
我有这个表单映射:
val myElement = Form(
mapping(
"title" -> nonEmptyText,
"schedule" ->
tuple("startSchedule" -> jodaDate("dd/MM/yyyy HH:mm"),
"endSchedule" -> jodaDate("dd/MM/yyyy HH:mm"))
.verifying(MyValidator().checkForEndScheduleConsistency("error.schedule")),
)(MyElement.apply)(MyElement.unapply)
)
MyElement类:
case class MyElement(title: String, schedule: (Datetime, Datetime))
MyValidator类:
def checkForEndScheduleConsistency(errorMsg: String) =
Constraint[(DateTime, DateTime)]("constraint.schedule", errorMsg) {
schedule =>
MyDomainValidator().checkForEndScheduleConsistency(schedule._1, schedule._2, Messages(errorMsg)) match {
case Success(s) => Valid
case Failure(f) => Invalid(ValidationError("custom error string from `f`"))
}
}
要求:如果调度与MyValidator对象不一致,则必须将错误消息关联到字段schedule.endSchedule(元组的元素)。
但是,为了使checkForEndScheduleConsistency 方法的两个必需元素(startSchedule 和endSchedule)都可用,我不能直接在嵌套元组的名为endSchedule 的元素上应用verifying 方法。相反,我必须在整个元组上应用一个才能包含startSchedule 变量,如代码 sn-p 所示。
缺点是错误没有映射到endSchedule,而是映射到schedule(这不代表我的HTML表单中的任何内容),因此当出现不一致的时间表时,屏幕上不会显示任何内容。
因此,我必须使用Form 的withError 方法来实现我的要求:
def create = Action {
implicit request =>
myForm.bindFromRequest.fold(
myFormWithErrors => {
myFormWithErrors.error("schedule") match { //check for the presence of potential schedule error
case Some(e) => {
BadRequest(views.html.create_element("Create an element", myFormWithErrors.withError("schedule.endSchedule", Messages("error.schedule"))))
}
case _ => BadRequest(views.html.create_element("Create an element", myFormWithErrors))
}
},
myForm => {
treatSubmittedMyForm(myForm)
}
)
}
=> 非常丑陋且抗 DRY。
有没有办法在元组上应用verifying,尽管如此,将错误消息应用到嵌套元组的元素?就我而言,在endSchedule。
【问题讨论】:
标签: forms scala playframework-2.0 playframework-2.1