2013-07-08 11 views
5

Znalazłem interesującą rzecz w Play! ramy stanowią weryfikację. Na przykład mam taką postać:Scala Zatwierdzenie formularza gry: wymagane boolean nie jest obowiązkowe

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)) 

Kiedy jestem wiązanie danych bez „mybool” obecny w moim JSON przechodzi walidacji i tworzy obiekt z „mybool = false”. Jest to dość dziwne zachowanie, tak jakbym przekazał te same dane, ale bez "tajemniczego" pola dostanę Validation Errors: Map(mystring -> error.required), którego spodziewam się zobaczyć - ponieważ brakuje pola.

Jeśli robię pole logiczna opcja, ale mam ręczne dodawanie takiego sprawdzenia:

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

i powiązać dane bez pola dostaję oczekiwany błąd:

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

Przykładowy zestaw danych:

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

Dlaczego wymagane sprawdzenie nie działa dla Boolean? Jakie jest najlepsze obejście tego problemu? Czy to jest zabawa! błąd lub po prostu czegoś nie rozumiem?

Dzięki za odpowiedzi.

Odpowiedz

3

Wyobrażam sobie, że jest to zgodne z projektem. Zwykle, jeśli masz pole boolowskie, możesz powiązać to z polem wyboru HTML. Jeśli pole jest zaznaczone po przesłaniu formularza, wszystko działa zgodnie z oczekiwaniami; Jeśli jednak pole nie jest zaznaczone, przeglądarki nie wysyłają nazwy pola z przesłanymi danymi. Zasadniczo nie ma różnicy między niezaznaczonym ramką a elementem nieistniejącym, więc Play musi przyjąć (dla pól boolowskich), że wartość jest "fałsz".

+1

Dzięki za odpowiedź. Brzmi jak wyjaśnienie. Wtedy prawdopodobnie to niepoprawne, że używam formularzy do wiązania moich danych przychodzących, które pochodzą z API, a nie z formularzy HTML. Na razie zastosuję obejście z opcjonalnym sprawdzaniem boolowskim i ręcznym. – psisoyev

+0

Jeśli spełnia większość potrzebnych informacji, nie widzę problemu z korzystaniem z Formularzy Play, niezależnie od tego, czy dane pochodzą z formularza, czy z żądania interfejsu API. Powinienem powiedzieć, że nie jestem obeznany ze Scalą, więc może istnieć jakiś wbudowany sposób robienia tego, co chcesz, ale czasami konieczne jest wykonanie własnej, niestandardowej weryfikacji. – estmatic

Powiązane problemy