J'ai un modèle ActiveRecord qui revient truede valid?(et .errors est vide), mais qui revient falsede 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 truede valid?(et .errors est vide), mais qui revient falsede 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.validil 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::RecordNotSavedc'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