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?

Agung Prasetyo
la source

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.

Chowlett
la source
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)

Michael Koper
la source