Я получил эту форму отображения: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 ple), если расписание противоречит объекту MyValidator
.
Однако для того, чтобы иметь как необходимые элементы (startSchedule
и endSchedule
), доступные для checkForEndScheduleConsistency
метода, я не могу применить метод verifying
непосредственно на элемент вложенного кортежа по имени endSchedule
. Вместо этого, я должен применить один на весь кортеж, чтобы включить переменную startSchedule
, как показано в фрагменте кода.
Недостатком является то, что ошибка не отображается на endSchedule
, а на schedule
(что не представляет ничего в моей HTML-форме), и поэтому при отображении несогласованного графика ничего не отображается.
Поэтому я должен использовать этот "обходной путь", чтобы достичь своей потребности с помощью Form
«s 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
.
Не плохая идея :) Я попробую это. Благодаря :) – Mik378