Ich habe ein Active Modell , das zurückkehrt true
von valid?
(und .errors leer ist ), wird aber zurückkehrt false
aus save()
. Wie kann ich herausfinden, warum das Speichern fehlschlägt, wenn die Modellinstanz gültig ist?
Ich habe ein Active Modell , das zurückkehrt true
von valid?
(und .errors leer ist ), wird aber zurückkehrt false
aus save()
. Wie kann ich herausfinden, warum das Speichern fehlschlägt, wenn die Modellinstanz gültig ist?
Antworten:
Überprüfen Sie alle Ihre Rückrufe.
Ich hatte ein Problem wie dieses, bei dem ich eine "after_validate" -Methode hatte, die fehlschlug, nachdem ich einige Änderungen am Modell vorgenommen hatte. Das Modell war gültig, aber das "after_validate" gab false zurück. Wenn ich es also verwendete model.valid
, sagte es true, aber wenn ich es speicherte, gab es mir Validierungsfehler (die vom after_validate-Rückruf durchlaufen wurden). Es war seltsam.
Schauen Sie sich den Anwendungs-Trace an und Sie sollten sehen können, welche Codezeile die Ausnahme auslöst.
"Hey! That's MY fake leg!" # Believe it or not, this is important
. Nicht dass ich das tun würde. ;)
true.tap { do_something }
Versuchen Sie es mit der Bang-Version save!
(mit einem Ausrufezeichen am Ende) und überprüfen Sie den resultierenden Fehler.
save!
können ausgelöst werden ActiveRecord::RecordInvalid
(da sie Validierungen ausführen) oder ActiveRecord::RecordNotSaved
so möchten Sie sie retten.
.save
Fehler diagnostiziert werden können , die nicht auf eine Validierung zurückzuführen sind. Die "am wenigsten unbefriedigende" Qualifikation bezieht sich auf Rails, nicht auf diese Antwort.
Wenn @user.save
(zum Beispiel) zurückgegeben wird false
, führen Sie dies einfach aus, um alle Fehler zu erhalten:
@user.errors.full_messages
Ja, ich habe dieses Problem behoben, indem ich sichergestellt habe, dass ich in all meinen before_ * -Rückrufen true zurückgebe, dann funktioniert es :)
Das Problem war, dass ich vergessen hatte, die Validierung zum Modell hinzuzufügen.
class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end