J'ai un modèle ActiveRecord qui revient true
de valid?
(et .errors est vide), mais qui revient false
de save()
. Si l'instance de modèle est valide, comment puis-je savoir ce qui cause l'échec de l'enregistrement?
91
J'ai un modèle ActiveRecord qui revient true
de valid?
(et .errors est vide), mais qui revient false
de save()
. Si l'instance de modèle est valide, comment puis-je savoir ce qui cause l'échec de l'enregistrement?
Réponses:
Vérifiez tous vos rappels.
J'ai eu un problème comme celui-ci où j'avais une méthode "after_validate" qui échouait après avoir apporté un tas de modifications au modèle. Le modèle était valide mais "after_validate" retournait false, donc si je l'utilisais,
model.valid
il disait vrai, mais si je sauvegardais, cela me donnait des erreurs de validation (transmises par le rappel after_validate). C'était étrange.Regardez la trace de l'application et vous devriez être en mesure de voir quelle ligne de code déclenche l'exception.
la source
"Hey! That's MY fake leg!" # Believe it or not, this is important
. Non pas que je ferais ça. ;)true.tap { do_something }
Essayez d'utiliser la version bang
save!
(avec un point d'exclamation à la fin) et inspectez l'erreur qui en résulte.la source
save!
peut augmenterActiveRecord::RecordInvalid
(car il exécute des validations) ouActiveRecord::RecordNotSaved
c'est ce que vous voudrez sauver..save
échecs qui ne sont pas dus à la validation. La qualification «la moins insatisfaisante» se réfère à Rails, pas à cette réponse.Si
@user.save
(par exemple) retournefalse
, exécutez simplement ceci pour obtenir toutes les erreurs:la source
Oui, j'ai résolu ce problème en m'assurant que je renvoie true dans tous mes rappels before_ *, puis cela commence à fonctionner :)
la source
Le problème que j'ai eu était que j'avais oublié d'ajouter la validation au modèle.
la source