我在Play中发现了有趣的东西!框架形式验证。例如,我有这样的形式:
case class Foo(mystring: String, myint: Int, mybool: Boolean) { // doing cool stuff here }
val myForm = Form(
mapping(
"mystring" -> text,
"myint" -> number,
"mybool" -> boolean
)(Foo.apply)(Foo.unapply))
当我在我的Json中绑定没有“mybool”的数据时,验证会传递并创建一个“mybool = false”的对象。这是非常奇怪的行为,好像我将传递相同的数据,但没有“mystring”字段,我将得到Validation Errors: Map(mystring -> error.required)
我希望看到 - 因为字段丢失。
如果我将布尔字段设为可选,但我手动添加了这样的检查:
"mybool" -> optional(boolean).verifying("mybool.required", _.isDefined)
并且在没有字段的情况下绑定数据我收到了预期的错误:
Validation Errors: Map(mybool -> mybool.required)
示例数据集:
{
"mystring": "stringHere",
"myint": 33
}
为什么必需的检查对布尔值不起作用?它的最佳解决方法是什么?这是一场比赛!或者我只是不明白?
感谢您的回答。
答案 0 :(得分:3)
我认为这是设计的。通常,如果您有一个布尔字段,那么您可以将其绑定到HTML复选框。如果在提交表单时选中该框,则所有内容均按预期工作;但是,如果未选中此框,则浏览器不会使用提交的数据发送字段名称。基本上,未经检查的框与根本不存在的元素之间没有区别,因此Play必须假设(对于布尔字段)该值为“false”。
答案 1 :(得分:0)
您可以执行以下操作:
val form: Form[Boolean] = Form[Boolean](
mapping[Boolean, Boolean](
"state" -> optional(boolean).verifying("state.required", _.isDefined).transform(_.get, Some(_))
)(identity)(Some(_))
)
这将允许您将布尔字段设为必填字段,从而覆盖“播放”的默认行为。
我们通常有Yes
和No
的单选按钮,而不是复选框,并且可以使用单选按钮