2013-03-03 43 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如果日程安排根据MyValidator对象不一致。

然而,为了同时具有所需的元件(startScheduleendSchedule)可用于checkForEndScheduleConsistency方法,我不能直接命名endSchedule嵌套元组的元件上施加verifying方法。相反,我必须在整个元组上应用一个变量,以包含startSchedule变量,如代码片段所示。

的缺点是,错误没有映射到endScheduleschedule(这并不代表我的HTML形式的任何东西),所以不显示任何内容不一致的时间表出现时,屏幕上。

因此,我必须用这种“解决办法”,以实现使用FormwithError方法,我的要求:

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

回答

2

也许是最好的解决办法是更换由你自己制作的一个渲染场时播放提供缺省的助手,为每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 2013-03-04 13:02:36

1

的最佳解决方案是精确的全局(调度)“错误”键进入更具体的生成的输入直接,这里的schedule.endSchedule输入:

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

通知部分:'_error -> hobbyForm.error("schedule")