2010-12-28 19 views
8

To pytanie pochodzi z mojego prostego problemu: another question. W tym pytaniu natknąłem się na sytuację, w której funkcja hasErrors() nie działa dla nietrwałej domeny klasy, nawet po wszystkich czynnościach wykonanych po the instruction, część 7.5.Jaki jest związek między validate() i hasErrors()

Idąc za przykładem Victora, naprawiłem problem, wywołując funkcję validate(), ale nie rozumiem, dlaczego to działa. Dokumenty Grails wydają się nic nie mówić o tym, że powinieneś wywołać funkcję validate() before hasErrors(). Jak to mogło się stać?

Odpowiedz

9

To ma sensu do mnie, że validate musiałaby być wywołana przed pytaniem obiektu czy hasErrors (lub save do odpowiednich obiektów domeny, który wzywa validate pod kołdrą). Walidacja w tym kontekście oznacza "sprawdź, czy ten obiekt jest prawidłowy i wskaż błędy, jeśli nie".

Alternatywnie, implementacja GORM musiałaby wywoływać validate za każdym razem, gdy wprowadzana jest zmiana w obiekcie, co dla mnie byłoby mniej pożądanym zachowaniem, ponieważ może wymagać dużej ilości pracy wykonywanej często i niepotrzebnie (niektóre z tych ograniczeń mogłyby wymaga dużego nakładu pracy).

Początek sekcji 7.2 jasno stwierdza: "Aby zweryfikować klasę domen, można wywołać metodę sprawdzania poprawności dla dowolnej instancji". Stwierdza również, że "w obrębie Grails istnieją zasadniczo dwie fazy sprawdzania poprawności, pierwsza faza to powiązanie danych, które występuje, gdy wiążesz parametry żądania z instancją, na przykład ... W tym momencie możesz już mieć błędy we właściwościach błędów z powodu Konwersja typów (np. konwersja ciągów na daty) Możesz sprawdzić te i uzyskać oryginalną wartość wejściową za pomocą interfejsu API błędów ... Druga faza sprawdzania poprawności ma miejsce, gdy wywoływane jest sprawdzanie poprawności lub zapisywanie To jest, gdy Grails sprawdzi powiązanie wartości ponownie określa zdefiniowane więzy. "

Wymienia to również documentation for hasErrors. Możesz uzyskać do niego dostęp, znajdując wywołanie metody w ramce nawigacji po lewej stronie, gdy jesteś na documentation site. Zawsze polecam przeglądanie tych stron, a także bardziej opisowych stron podręcznika użytkownika, ponieważ często dają trochę więcej szczegółów. Here's the page for the validate method też.

Nigdy nie miałem problemu z bezpośrednim dzwonieniem pod numer validate - dla mnie jest to bardzo jasne i mogę wybrać punkt, w którym wykonano całą pracę, i jestem gotowy na walidację. Nie widzę opcji, aby zmienić to zachowanie w dowolnym miejscu, ale jeśli chcesz, aby validate było wywoływane automatycznie lub pod pewnymi warunkami, możesz użyć magii Groovy do programowania meta przez dodanie do klasy invokeMethod i wywołanie jej przed wywołaniem validate niektóre zaproszenia. Zobacz: here i here. (Nie jestem pewien, czy bym to polecił i pamiętaj, że twoja klasa będzie teraz zależna od tego, czy użyjesz jej w ramach sprawdzania poprawności GORM, ponieważ metoda validate mogłaby nie istnieć inaczej).

+0

Dziękuję za ostrożną odpowiedź, rozumiem to teraz. –

+2

Nawiasem mówiąc ... Peter Ledbrook (jeden z autorów znakomitej książki Grails in Action) napisał świetną serię artykułów na temat GORM Gotchas - bardzo warto przeczytać, aby poznać niektóre szczegóły tego wszystkiego. działa: [część 1] (http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/), [część 2] (http://blog.springsource.com/2010/ 07/02/gorm-gotchas-part-2 /) i [part 3] (http://blog.springsource.com/2010/2010/28/gorm-gotchas-part-3/). –

Powiązane problemy