2013-03-03 1 views
3

Я получил эту форму отображения: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.

ответ

2

Вероятно, лучшим решением является замена хелперы по умолчанию, предоставленные Play при отображении поля одним из ваших собственных решений, в соответствии с documentation:

@(elements: helper.FieldElements) 

<div class="@if(elements.hasErrors) {error}"> 
    <label for="@elements.id">@elements.label</label> 
    <div class="input"> 
     @elements.input 
     <span class="errors">@elements.errors.mkString(", ")</span> 
     <span class="help">@elements.infos.mkString(", ")</span> 
    </div> 
</div> 

Таким образом, вы можете вручную заменить ссылку об ошибке в правый элемент. Не очень приятно, но вы должны иметь возможность создавать из него повторно используемый тег.

+0

Не плохая идея :) Я попробую это. Благодаря :) – Mik378

1

Лучшее решение для точного глобального ключа (к графику) «ошибки» в более конкретном генерируемой ввода непосредственно, здесь schedule.endSchedule вход:

@inputText(hobbyForm("schedule.endSchedule"), 'id -> "schedule.endSchedule", '_error -> hobbyForm.error("schedule") 

Обратите внимание на часть: '_error -> hobbyForm.error("schedule")

 Смежные вопросы

  • Нет связанных вопросов^_^