3

私はこのフォームマッピングを持っています:

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によってスケジュールが矛盾している場合は、フィールド (タプルの要素)にエラー メッセージを関連付ける必要がありMyValidatorます。

ただし、必要な要素 (startScheduleendSchedule) の両方をメソッドで使用できるようにするために、入れ子になったタプルの という名前の要素にメソッドを直接checkForEndScheduleConsistency適用することはできません。代わりに、コード スニペットに示すように、変数を含めるためにタプル全体に 1 つを適用する必要があります。verifyingendSchedulestartSchedule

欠点は、エラーがマップされているのでは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)
        }
      )
  }

=>非常に醜く、乾燥防止。

タプルに適用する方法はありますverifyingか?それにもかかわらず、ネストされたタプルの要素にエラーメッセージを適用しますか? 私の場合、endSchedule.

4

2 に答える 2

2

おそらく最良の解決策は、ドキュメントに従って、フィールドを独自に作成したものでレンダリングするときに、Play が提供するデフォルトのヘルパーを置き換えることです。

@(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>

そうすれば、エラー参照を正しい要素に手動で置き換えることができます。あまりいいとは言えませんが、そこから再利用可能なタグを作成できるはずです。

于 2013-03-04T12:07:04.947 に答える
1

最善の解決策は、グローバルな(スケジュールするための)「エラー」キーを、より具体的に生成された入力、ここでは入力に直接正確に入力することschedule.endScheduleです。

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

次の部分に注意してください。'_error -> hobbyForm.error("schedule")

于 2013-03-10T08:02:06.223 に答える