Mam model ActiveRecord, który wraca true
z valid?
(i .errors jest pusty), ale wraca false
z save()
. Jeśli instancja modelu jest prawidłowa, jak mogę dowiedzieć się, co powoduje niepowodzenie zapisu?
Mam model ActiveRecord, który wraca true
z valid?
(i .errors jest pusty), ale wraca false
z save()
. Jeśli instancja modelu jest prawidłowa, jak mogę dowiedzieć się, co powoduje niepowodzenie zapisu?
Odpowiedzi:
Sprawdź wszystkie swoje oddzwonienia.
Miałem taki problem, gdy miałem i metodę „after_validate”, która zawodziła po wprowadzeniu wielu zmian w modelu. Model był prawidłowy, ale "after_validate" zwracał fałsz, więc jeśli użyłem model.valid
go, powiedziałem prawdę, ale jeśli go zapisałem, dostałem błędy walidacji (przekazane z wywołania zwrotnego after_validate). To było dziwne.
Spójrz na ślad aplikacji, a powinieneś być w stanie zobaczyć, który wiersz kodu zgłasza wyjątek.
"Hey! That's MY fake leg!" # Believe it or not, this is important
. Nie żebym to zrobił. ;)
true.tap { do_something }
Spróbuj użyć wersji save!
z hukiem (z wykrzyknikiem na końcu) i sprawdź wynikowy błąd.
save!
może podnieść ActiveRecord::RecordInvalid
(ponieważ uruchamia walidację), a ActiveRecord::RecordNotSaved
więc to jest to, co chcesz uratować.
.save
niepowodzenia, które nie są spowodowane walidacją. Określenie „najmniej niezadowalające” odnosi się do Railsów, a nie do tej odpowiedzi.
Jeśli @user.save
(na przykład) zwraca false
, po prostu uruchom to, aby uzyskać wszystkie błędy:
@user.errors.full_messages
Tak, rozwiązałem ten problem, upewniając się, że zwracam wartość true we wszystkich moich wywołaniach zwrotnych before_ *, a następnie zaczyna działać :)
Problem polegał na tym, że zapomniałem dodać walidację do modelu.
class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end