Pourriez-vous expliquer en détail ce que sont les rappels :before_save
et :before_create
Ruby on Rails, et ce qu'ils ont à voir avec les validations Rails? La validation a-t-elle lieu après :before_save
ou :before_create
?
Pourriez-vous expliquer en détail ce que sont les rappels :before_save
et :before_create
Ruby on Rails, et ce qu'ils ont à voir avec les validations Rails? La validation a-t-elle lieu après :before_save
ou :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_validation
before_validation_on_create
after_validation
after_validation_on_create
before_save
before_create
after_create
after_save
Les opérations de mise à jour ont exactement le même ensemble, sauf read update
au lieu de create
partout (et UPDATE au lieu de INSERT ).
À partir de là, vous pouvez voir que la validation est effectuée avant les rappels before_save
et before_create
.
Le before_save
se produit légèrement avant le before_create
. À ma connaissance, rien ne se passe entre eux; mais before_save
se déclenchera également sur les opérations de mise à jour, tandis que before_create
ne se déclenchera que sur Creates.
after_save
ou after_create
?
after_save
ou after_create
, self
est 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_create
s'agit d'un nouvel objet enregistré dans la base de données, et non de la create
méthode réellement appelée. Ainsi, before_create
peut toujours être tiré même de la save
méthode.
before_save
3e et before_create
5e.
before_save
est appelée à chaque fois qu'un objet est enregistré. Donc pour les objets nouveaux et existants. (créer et mettre à jour une action)
before_create
seulement 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 => :create
ne fonctionne pas (au moins sur les rails 3.2)
before_save :generate_api_key, :if => :new_record?
before_validation_on_create
etafter_validation_on_create
sont supprimés à partir de Rails 3 , utilisez à la placebefore_validation
etafter_validation
respectivement avec option:on => :create
.