2013-07-08 24 views
5

我发现Play中有趣的事情!框架形成验证。例如,我有这样的形式:Scala 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)) 

当我没有“mybool”存在于我的JSON,验证通过结合数据,并创建以“mybool =假”的对象。这是非常奇怪的行为,就好像我会传递相同的数据,但没有“mystring”字段,我会得到Validation Errors: Map(mystring -> error.required),我期望看到 - 因为字段丢失。

如果我做布尔场可选的,但是我手工添加这样的检查:

"mybool" -> optional(boolean).verifying("mybool.required", _.isDefined) 

并绑定数据,而我得到的预期错误的领域:

Validation Errors: Map(mybool -> mybool.required) 

示例数据集:

{ 
    "mystring": "stringHere", 
    "myint": 33 
} 

为什么必需的检查不适用于布尔?什么是最好的解决方法?这是一个戏剧!错误或我只是不明白的东西?

感谢您的回答。

回答

3

我会想象它的设计。通常情况下,如果你有一个布尔型字段,那么你会将它绑定到一个HTML复选框。如果在提交表单时选中此框,则所有工作都按预期进行;但是,如果未选中该框,浏览器不会将字段名称与提交的数据一起发送。基本上,未经检查的框与完全不存在的元素之间没有区别,因此Play必须假定(对于布尔字段)该值为“false”。

+1

感谢您的回答。听起来像一个解释。那么可能这是不正确的,我使用表单来绑定我的传入数据,它来自API,而不是来自HTML表单。现在我将使用可选布尔值和手动检查的解决方法。 – psisoyev

+0

如果它确实需要大部分内容,那么无论数据来自表单提交还是作为API请求,我都会发现使用Play的表单没有问题。我应该说我对Scala并不熟悉,所以可能有一些内置的方法来做你想做的事情,但有时候需要做自己的定制验证。 – estmatic