Scala Play 中的可选复选框 - 表单不验证
Optional checkbox in Scala Play - form does not validate
我刚开始使用 Play,我正在尝试创建一个带有 "optional checkbox" 的表单。用户必须同意一般条款(不要共享您的登录凭据,...)。第二个复选框是可选的,用户可以决定下次登录时是否再次显示此提示:
我在我的 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
它们都return一个映射[布尔值]。
我已经使用 Play 2.3.8 尝试了您的示例,它似乎在传递这些参数时正确验证:
abuseHintAccepted:true
dismissHintInFuture:true
值得确保发布的表单字段名称和值 (true/false) 在您描述的所有场景中都是正确的(您没有提供那部分代码)。
boolean
和 checked(msg)
之间的区别在于 checked(msg)
应用了验证以确保值为真 - 它等同于 boolean verifying (msg, _ == true)
-(请参阅 Play framework source).
最后,checked()
对 abuseHintAccepted
的验证意味着不需要对整个表单进行 verifying
检查,但这不应该影响表单的行为(这只是重复验证)。
我刚开始使用 Play,我正在尝试创建一个带有 "optional checkbox" 的表单。用户必须同意一般条款(不要共享您的登录凭据,...)。第二个复选框是可选的,用户可以决定下次登录时是否再次显示此提示:
我在我的 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
它们都return一个映射[布尔值]。
我已经使用 Play 2.3.8 尝试了您的示例,它似乎在传递这些参数时正确验证:
abuseHintAccepted:true
dismissHintInFuture:true
值得确保发布的表单字段名称和值 (true/false) 在您描述的所有场景中都是正确的(您没有提供那部分代码)。
boolean
和 checked(msg)
之间的区别在于 checked(msg)
应用了验证以确保值为真 - 它等同于 boolean verifying (msg, _ == true)
-(请参阅 Play framework source).
最后,checked()
对 abuseHintAccepted
的验证意味着不需要对整个表单进行 verifying
检查,但这不应该影响表单的行为(这只是重复验证)。