2013-07-08 23 views
5

私はPlayで面白いことを見つけました!フレームワークは検証を形成します。たとえば、私は、このような形式になります。Scalaプレイフォームの検証:必須ブール値は必須ではありません

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 
} 

を必要なチェックがブールのために動作しないのはなぜ?何が最善の回避策ですか?それは遊びですか!バグか、何か分からないだけですか?

ご回答ありがとうございます。

答えて

3

私はそれが設計によるものだと思います。通常、ブール値のフィールドがある場合は、それをHTMLチェックボックスにバインドします。フォームが送信されたときにチェックボックスがオンになっていると、すべて正常に動作します。ただし、ボックスがチェックされていない場合、ブラウザは送信されたデータとともにフィールド名を送信しません。基本的に、未チェックのボックスと要素がまったく存在しないため、Playは値が「偽」であると仮定する必要があります(ブール値フィールドの場合)。

+1

あなたの答えをありがとう。説明のように聞こえる。次に、HTMLフォームからではなく、APIから来る入力データをバインドするためにフォームを使用していると誤っている可能性があります。今のところ、オプションのブール値と手動によるチェックで回避策を使用します。 – psisoyev

+0

あなたが必要としているものの大部分を占めている場合、データがフォームの提出やAPIリクエストから来ているかどうかにかかわらず、Playのフォームの使用に問題はありません。 Scalaにはあまり精通していないと言わなければなりません。あなたが望むことを実行する組み込みの方法がいくつかあるかもしれませんが、時には独自のカスタム検証を行う必要があります。 – estmatic

関連する問題