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")