Scala Play: как визуализировать сопоставления форм с повторными и вложенными значениями? - PullRequest
0 голосов
/ 23 мая 2019

Я работаю над Scala Play 2.7.x (вы можете оформить проект здесь play-silhouette-seed googleauth branch ), и у меня есть форма, определенная как:

object TotpSetupForm {
  val form = Form(
    mapping(
      "sharedKey" -> nonEmptyText,
      "scratchCodes" -> seq(mapping(
        "hasher" -> nonEmptyText,
        "password" -> nonEmptyText,
        "salt" -> optional(nonEmptyText)
      )(PasswordInfo.apply)(PasswordInfo.unapply)),
      "scratchCodesPlain" -> optional(seq(nonEmptyText)),
      "verificationCode" -> nonEmptyText(minLength = 6, maxLength = 6)
    )(Data.apply)(Data.unapply)
  )

  case class Data(
    sharedKey: String,
    scratchCodes: Seq[PasswordInfo],
    scratchCodesPlain: Option[Seq[String]],
    verificationCode: String = "")
}

Где PasswordInfo взято из Play-Silhouette и выглядит так:

case class PasswordInfo(
  hasher: String,
  password: String,
  salt: Option[String] = None
) extends AuthInfo    

В моем контроллере я заполняю форму и передаю ее в качестве параметра моему шаблону представления следующим образом.Обратите внимание, что я отладил его, и totpInfo.scratchCodes имеет 5 значений, и форма заполнена правильно:

val formData = TotpSetupForm.form.fill(TotpSetupForm.Data(totpInfo.sharedKey, totpInfo.scratchCodes, totpInfo.scratchCodesPlain))
Ok(views.html.someView(formData, ...)

Я отображаю представление следующим образом, обратите внимание, что я прочитал Повторные значения форм Scalaпримечание к документации :)

@helper.form(action = controllers.routes.TotpController.submit()) {
    @helper.CSRF.formField
    @b3.text(totpForm("verificationCode"), '_hiddenLabel -> messages("verificationCode"), 'placeholder -> messages("verificationCode"), 'autocomplete -> "off", 'class -> "form-control input-lg")
    @b3.hidden(totpForm("sharedKey"))
    @helper.repeatWithIndex(totpForm("scratchCodes"), min = 1) { (scratchCodeField, index) =>
        @b3.hidden(scratchCodeField, '_label -> ("scratchCode #" + index))
    }
    <div class="form-group">
        <div>
            <button id="submit" type="submit" value="submit" class="btn btn-lg btn-primary btn-block">@messages("verify")</button>
        </div>
    </div>
}

, хотя последовательность формы scratchCodes заполнена правильно, каждое из значений последовательности отображается как пустое:

<input type="hidden" name="scratchCodes[0]" value="" >
<input type="hidden" name="scratchCodes[1]" value="" >
<input type="hidden" name="scratchCodes[2]" value="" >
<input type="hidden" name="scratchCodes[3]" value="" >
<input type="hidden" name="scratchCodes[4]" value="" >

Количество полей вхотя последовательность верна.

Я также пытался использовать альтернативу @helper.repeat и даже использовать @helper.input вместо @b3.hidden, просто чтобы быть уверенным, и результат всегда одинаков ... Я становлюсь пустым* оценивается PasswordInfo кортежей.

Как это исправить?

1 Ответ

0 голосов
/ 23 мая 2019

ОК обнаружил виновника: повторяющиеся + вложенные значения требуют доступа к каждому атрибуту в отдельности, например:

@helper.repeat(totpForm("scratchCodes"), min = 1) { scratchCodeField =>
  @b3.hidden(scratchCodeField("hasher"))
  @b3.hidden(scratchCodeField("password"))
  @b3.hidden(scratchCodeField("salt"))
}

затем работает нормально, и запрос post корректно заполняет последовательность PasswordInfo UDT.

...