我有這種形式的映射的一個元素:PlayFramework 2.X - 表格/關聯錯誤消息元組
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`"))
}
}
要求:必須將錯誤消息關聯到字段schedule.endSchedule
(tu如果日程安排根據MyValidator
對象不一致。
然而,爲了同時具有所需的元件(startSchedule
和endSchedule
)可用於checkForEndScheduleConsistency
方法,我不能直接命名endSchedule
嵌套元組的元件上施加verifying
方法。相反,我必須在整個元組上應用一個變量,以包含startSchedule
變量,如代碼片段所示。
的缺點是,錯誤沒有映射到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)
}
)
}
=>非常醜陋和防乾燒。
有沒有辦法在元組上應用verifying
,儘管如此,應用錯誤消息到嵌套元組的元素?在我的情況下,在endSchedule
。
不是糟糕的主意:)我會嘗試。謝謝 :) – Mik378 2013-03-04 13:02:36