2010-10-27 14 views

Odpowiedz

34

Masz rację, błąd sprawdzania poprawności nadal wyzwala wywołanie zwrotne after_validation. Jest to kolejność wywołań zwrotnych:

  1. before_validation
  2. after_validation
  3. before_save
  4. before_create
  5. after_create
  6. after_save
  7. after_commit

Również aby zrozumieć większy łańcuch zdarzeń: dokumentacja mówi, że wywołanie zwrotne "przed", które zwraca wartość false, zatrzyma łańcuch i zatrzyma akcję (zapisywanie, tworzenie, aktualizowanie itd.). Wywołanie "po", które zwraca wartość false, zatrzyma łańcuch wywołań zwrotnych, ale nie całą akcję.

"after_validation" to ostatnia rzecz do uruchomienia, jeśli walidacje się nie powiodą, a wszystko zostanie zatrzymane. Jeśli jednak przejdą, wszystko inne jest zawijane w transakcji bazy danych i wycofywane, jeśli coś pójdzie nie tak. Zatem twoje "before_create" może na przykład utworzyć obiekt potomny i zostanie bezpiecznie cofnięte, jeśli samo tworzenie obiektu się nie powiedzie.

+1

Dziękuję! Twoje przybite to. Tak więc, jeśli after_validation zwróci wartość false, czy wycofa transakcję? – rafamvc

+2

Nie ma za co! Jeśli argument after_validation zwróci wartość false, zatrzyma on wszelkie wcześniejsze wywołania zwrotne, ale nie zatrzyma samej transakcji. Jest tak prawdopodobnie dlatego, że callbacks "before" mają na celu sprawdzenie potencjalnych problemów, callback "after" ma na celu wykonanie zadań po stronie, które należy wykonać po pomyślnym wykonaniu kroku. Na przykład możesz użyć before_validation, aby ustawić domyślne dla atrybutu, a jeśli to się nie powiedzie, chcesz zatrzymać cały proces. Możesz użyć parametru after_validation, aby zaktualizować licznik "failed_create", jeśli wystąpią jakiekolwiek błędy. –

+0

@rafamvc, jeśli to jest poprawna odpowiedź, dlaczego zaakceptowałeś drugą? – Mischa

Powiązane problemy