Pourriez-vous expliquer en détail ce que sont les rappels :before_saveet :before_createRuby on Rails, et ce qu'ils ont à voir avec les validations Rails? La validation a-t-elle lieu après :before_saveou :before_create?
Pourriez-vous expliquer en détail ce que sont les rappels :before_saveet :before_createRuby on Rails, et ce qu'ils ont à voir avec les validations Rails? La validation a-t-elle lieu après :before_saveou :before_create?
Réponses:
Dans une opération de création sous Rails, il y a six rappels avant l'opération de base de données et deux après. Dans l'ordre, ce sont:
before_validationbefore_validation_on_createafter_validationafter_validation_on_createbefore_savebefore_create
after_createafter_saveLes opérations de mise à jour ont exactement le même ensemble, sauf read updateau lieu de createpartout (et UPDATE au lieu de INSERT ).
À partir de là, vous pouvez voir que la validation est effectuée avant les rappels before_saveet before_create.
Le before_savese produit légèrement avant le before_create. À ma connaissance, rien ne se passe entre eux; mais before_savese déclenchera également sur les opérations de mise à jour, tandis que before_createne se déclenchera que sur Creates.
after_saveou after_create?
after_saveou after_create, selfest l'enregistrement qui vient d'être enregistré, tel qu'il existe après la sauvegarde. Cela inclut des champs générées automatiquement aiment id, created_at, updated_at.
before_creates'agit d'un nouvel objet enregistré dans la base de données, et non de la createméthode réellement appelée. Ainsi, before_createpeut toujours être tiré même de la saveméthode.
before_save3e et before_create5e.
before_saveest appelée à chaque fois qu'un objet est enregistré. Donc pour les objets nouveaux et existants. (créer et mettre à jour une action)
before_createseulement avant la création. Donc uniquement pour les nouveaux objets (créer une action)
before_create contre before_save :on => :create
Il faut parfois faire attention à l'ordre des rappels
Voir ici pour plus de détails:
http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/
before_save :on => :createne fonctionne pas (au moins sur les rails 3.2)
before_save :generate_api_key, :if => :new_record?
before_validation_on_createetafter_validation_on_createsont supprimés à partir de Rails 3 , utilisez à la placebefore_validationetafter_validationrespectivement avec option:on => :create.