2013-07-08 51 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