2011-11-04 12 views
15

Teraz, z tego, co wiem, zostanie wywołana after_validation, nawet jeśli model nie przejdzie walidacji. Czy istnieje sposób na wywołanie go tylko wtedy, gdy model jest ważny? Próbowałem dodać return false unless self.valid? w metodzie after_validation, ale to ponownie uruchamia sprawdzanie poprawności i tworzy nieskończoną pętlę.Ruby on Rails - after_validation, jeśli jest poprawna?

+2

Cóż, możesz sprawdzić "błędy", np. "Return false until self.errors.empty?" Lub "return false if errors.any?". – tbuehlmann

Odpowiedz

16

niewydolnego walidacji dodać do błędów na płycie, więc może po prostu sprawdzić:

return false unless self.errors.empty? 
+0

Próbowałem już wcześniej i nadal nie udało się. Następnie sprawdziłem kod i zauważyłem, że ponownie sprawdzam poprawność (kiedy nie powinienem). Teraz działa idealnie. Dziękuję Ci! –

2

Czy myślałeś o użyciu callback before_save?

Sądzę, że będą one wywoływane tylko wtedy, gdy obiekt jest ważny.

+2

Co, jeśli nie chcę tego zapisać? Po prostu chcesz to sprawdzić? –

+1

Nie można również robić bardziej zaawansowanych rzeczy w 'before_save', jak sprawdzanie, które pola zostały zmienione w asocjacji (przez' xxx_changed? '), Ponieważ asocjacje są najpierw aktualizowane, w ten sposób resetując' zmieniony 'hash. Jako takie, konieczne jest wykonanie tych sprawdzeń w 'after_validation' jako obejście. –

0

wiem, że to jest stare pytanie, ale wpadłem na ten sam błąd przy użyciu walidacji niestandardowej na modelu Stworzyłem. Patrząc na docs jest część obejmująca niestandardowe metody i stwierdza, że ​​takie walidacje są wywoływane za każdym razem metodą .valid?. Prawdopodobnie dlatego uruchomiono pętlę nieskończoną, gdy wywołano wywołanie zwrotne :after_validation.