【问题标题】:PlayFramework 2.x - Forms / Associating error message to one element of a tuplePlayFramework 2.x - 将错误消息与元组的一个元素相关联
【发布时间】:2013-02-17 09:28:37
【问题描述】:

我有这个表单映射:

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

要求:如果调度与MyValidator对象不一致,则必须将错误消息关联到字段schedule.endSchedule(元组的元素)。

但是,为了使checkForEndScheduleConsistency 方法的两个必需元素(startScheduleendSchedule)都可用,我不能直接在嵌套元组的名为endSchedule 的元素上应用verifying 方法。相反,我必须在整个元组上应用一个才能包含startSchedule 变量,如代码 sn-p 所示。

缺点是错误没有映射到endSchedule,而是映射到schedule(这不代表我的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)
        }
      )
  }

=> 非常丑陋且抗 DRY。

有没有办法在元组上应用verifying,尽管如此,将错误消息应用到嵌套元组的元素?就我而言,在endSchedule

【问题讨论】:

    标签: forms scala playframework-2.0 playframework-2.1


    【解决方案1】:

    可能最好的解决方案是根据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>
    

    这样您就可以手动将错误引用替换为正确的元素。不是特别好,但你应该能够从中创建一个可重用的标签。

    【讨论】:

    • 不错的主意 :) 我会尝试的。谢谢:)
    【解决方案2】:

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

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

    注意部分:'_error -&gt; hobbyForm.error("schedule")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2016-01-09
      • 2012-07-13
      • 2017-03-23
      • 2011-11-15
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多