Mam model ActiveRecord, który wraca truez valid?(i .errors jest pusty), ale wraca falsez save(). Jeśli instancja modelu jest prawidłowa, jak mogę dowiedzieć się, co powoduje niepowodzenie zapisu?
Mam model ActiveRecord, który wraca truez valid?(i .errors jest pusty), ale wraca falsez 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.validgo, 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::RecordNotSavedwięc to jest to, co chcesz uratować.
.saveniepowodzenia, 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