Scala Play中的可选复选框 - 表单不验证

时间:2015-02-28 17:21:07

标签: scala playframework playframework-2.0

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

我在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]。

1 个答案:

答案 0 :(得分:1)

我使用Play 2.3.8尝试过您的示例,它确实在传递这些参数时正确验证:

abuseHintAccepted:true
dismissHintInFuture:true

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

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

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