【问题标题】:Optional checkbox in Scala Play - form does not validateScala Play 中的可选复选框 - 表单不验证
【发布时间】:2015-03-01 06:16:53
【问题描述】:

我刚开始使用 Play,我正在尝试创建一个带有“可选复选框”的表单。用户必须同意一般条款(不要共享您的登录凭据,...)。第二个复选框是可选的,用户可以决定下次登录时是否再次显示此提示:

我在我的 Scala 控制器中创建了一些表单验证代码:

case class AbuseStatus(abuseHintAccepted: Boolean, dismissAbuseHintInFuture: Boolean)
val abuseHintForm = Form(
    mapping(
        "abuseHintAccepted" -> checked("Please accept the general terms."),
        "dismissHintInFuture" -> boolean

    )(AbuseStatus.apply)(AbuseStatus.unapply) verifying ("you must accept the general terms", result => result match {
      case abuseStatus =>
      {
        abuseStatus.abuseHintAccepted.booleanValue()
      }
    })
  )

我正在使用以下方法来处理表单发送后的 POST 请求。

def sendAbuseHintForm = Action {implicit request =>
    abuseHintForm.bindFromRequest.fold(
      formWithErrors =>
      {
        Logger.info("Form did not validate")
        formWithErrors.errors.map(error => Logger.info(error.messages.mkString(",")))
        Ok(views.html.abuseHint(formWithErrors))
      },
      abuseStatus =>
      {
        if(abuseStatus.dismissAbuseHintInFuture)
        {
          Logger.info(">>>dismissHintInFuture = true")
          Ok(views.html.home()).withCookies(showAbuseHintCookie)
        }
        else
          Ok(views.html.home())
      }
    )
  }

如果两个复选框都设置为 true,则表单不会验证。我希望它至少在第一个复选框设置为 true 时进行验证(第二个是可选的)。我怎样才能做到这一点,有什么区别

"abuseHintAccepted"->checked("...")

"dismissHintInFuture"->boolean

它们都返回一个 Mapping[Boolean]。

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    我已经使用 Play 2.3.8 尝试了您的示例,并且在传递这些参数时它似乎可以正确验证:

    abuseHintAccepted:true
    dismissHintInFuture:true
    

    值得确保发布的表单字段名称和值(真/假)在您描述的所有场景中实际上都是正确的(您尚未提供该部分代码)。

    booleanchecked(msg) 之间的区别在于 checked(msg) 应用了验证以确保值为 true - 它等效于 boolean verifying (msg, _ == true) -(请参阅 Play framework source)。

    最后,您对abuseHintAcceptedchecked() 验证意味着不需要对整个表单进行verifying 检查,但这不应该影响表单的行为(它只是重复验证)。

    【讨论】:

    • 使用表单助手生成的 HTML 中的字段名称不正确。感谢您的提示!
    • 我注意到代码中有很多硬编码的字符串。如果它们不匹配,就很难找出问题所在。是否有可能避免这种额外的复杂性(以便拼写错误)不会影响代码的功能?
    • @slashburn 您可以将字符串字段名作为 val 存储在可以从控制器和视图中引用的对象上吗?我不知道更好的方法。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2015-12-26
    • 2010-10-01
    • 1970-01-01
    • 2017-05-04
    • 2011-10-24
    相关资源
    最近更新 更多