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?
91
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.
źródło
"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.źródło
save!
może podnieśćActiveRecord::RecordInvalid
(ponieważ uruchamia walidację), aActiveRecord::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) zwracafalse
, po prostu uruchom to, aby uzyskać wszystkie błędy:@user.errors.full_messages
źródło
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ć :)
źródło
Problem polegał na tym, że zapomniałem dodać walidację do modelu.
class ContactGroup < ActiveRecord::Base validates_presence_of :name end
źródło