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?
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.
"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.
save!
peut augmenter ActiveRecord::RecordInvalid
(car il exécute des validations) ou ActiveRecord::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) retourne false
, exécutez simplement ceci pour obtenir toutes les erreurs:
@user.errors.full_messages
Oui, j'ai résolu ce problème en m'assurant que je renvoie true dans tous mes rappels before_ *, puis cela commence à fonctionner :)
Le problème que j'ai eu était que j'avais oublié d'ajouter la validation au modèle.
class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end