2010-09-07 6 views
14

Je joue un peu avec les nouveaux Rails 3 API et j'ai une question concernant la nouvelle méthode run_callbacks(kind, *args, &block)Rails 3 run_callbacks méthode

Dans le code suivant:

class User < ActiveRecord::Base 
    before_save :say_hi 
    after_save :say_bye 

    private 

    def say_hi; puts "hi"; end 

    def say_bye; puts "bye"; end 

end 

Je peux appeler explicitement les callbacks sur réaliserez en cours d'exécution:

> u.run_callbacks(:save) 
hi 
bye 
=> true 

Mais ma question est, comment puis-je seulement exécuter le before_save ou after_save rappel?

Révision du code run_callbacks(kind, *args, &block):

# File activesupport/lib/active_support/callbacks.rb, line 92 
def run_callbacks(kind, *args, &block) 
    send("_run_#{kind}_callbacks", *args, &block) 
end 

Je ne sais pas comment construire *args seulement appeler avant ou après callbacks, j'ai essayé quelque chose comme u.run_callbacks(:before_save) (me donne erreur de méthode non définie) et u.run_callbacks(:save, :before) exécute tous les enregistrer rappels (avant et après).

Répondre

5

Je suis toujours sur la façon de faire la after_save seulement, mais il suffit d'exécuter le rappel de before_save, vous pouvez faire quelque chose comme:

u.run_callbacks(:save) { false } 

Cela devrait annuler les callbacks après les before_save sont exécutés.

7

Il semblerait que vous rencontriez un bogue dans Rails 3.0. Il semble être dans la file d'attente pour 3.0.1 comme mentionné dans this lighthouse ticket. Comme le dit @venables, vous pouvez au moins obtenir les callbacks before_save en envoyant false à run_callbacks(:save).

+0

Oui, il semble que nous ne sommes pas en mesure d'exécuter les rappels d'enregistrement 'before' ou' after' individuellement :(, au moins d'une manière plus propre: – jpemberthy

+0

@jpemberthy - si vous mettez à jour votre question avec une utilisation spécifique cas, peut-être nous pouvons trouver une solution de contournement qui suffira jusqu'à ce que le bug est adressé? – Brian

+0

merci, mais ce n'est pas nécessaire, je jouais juste avec la nouvelle API (merci dieu) Ce n'est pas une chose à migrer de 2.3.x ou quelque chose Je travaille sur: P – jpemberthy