Ruby on Rails Callback, quelle est la différence entre: before_save et: before_create?


184

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:


363

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:

  1. before_validation
  2. before_validation_on_create
  3. after_validation
  4. after_validation_on_create
  5. before_save
  6. before_create

    INSERER BASE DE DONNÉES
  7. after_create
  8. after_save

Les 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.


27
before_validation_on_createet after_validation_on_createsont supprimés à partir de Rails 3 , utilisez à la place before_validationet after_validationrespectivement avec option :on => :create.
Dim

Comment feriez-vous référence à l'enregistrement qui vient d'être créé lorsque vous utilisez after_saveou after_create?
bcackerman

@bcackerman - dans le rappel 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.
Chowlett du

Souvenez-vous également qu'il 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.
Steve

1
@Rads - euh, non? Les documents répertorient toujours les before_save3e et before_create5e.
Chowlett

136

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)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.