5

Sto usando Rails 3.1.0 e vorrei sapere se è possibile gestire le chiamate after_save e after_destroy "ugualmente". Cioè, ho bisogno di eseguire gli stessi metodi per entrambi i callback after_save e after_destroy.C'è un modo per gestire `after_save` e` after_destroy` "ugualmente"?

In questo momento devo gestire questi callback separatamente anche se quelli compiere per la stessa cosa:

after_save do |record| 
    # Make a thing 
end 

after_destroy do |record| 
    # Make the same thing as in the 'after_save' callback 
end 

Quindi, c'è un modo per gestire after_save e after_destroy "altrettanto"?

+1

chiamata lo stesso metodo da entrambi? –

+0

@Dave Newton - I metodi sono letteralmente uguali. – Backo

+0

Capisco che - ecco perché ho detto di chiamare lo stesso metodo da entrambi, sia che stiate usando il modulo nel vostro post, sia da un riferimento al metodo come nella risposta. –

risposta

20

Invece di un blocco di dare after_save e after_destroy nome di un metodo del modello come un simbolo.

class ModelName < AR 
    after_save :same_callback_method 
    after_destroy :same_callback_method 

    def same_callback_method 
    # do the same for both callbacks 
    end 
end 
+2

Una classe è definita con la parola chiave 'class', non con la parola chiave' def'. – Gazler

+0

@Gazler: well spotted :) – Vapire

5
class Foo < ActiveRecord::Base 
    after_save :my_callback 
    after_destroy :my_callback 

    private 
    def my_callback 
    #Do stuff 
    end 
end 
+0

A seconda del caso d'uso, 'protected' può essere preferito a' private' – ksol

5

Per eseguire la stessa richiamata sia dopo il salvataggio e la distruzione, è possibile utilizzare after_commit

after_commit do |record| 
    # Is called after creating, updating, and destroying. 
end 

http://apidock.com/rails/ActiveRecord/Transactions/ClassMethods/after_commit

+0

È mia esperienza che funziona solo quando l'operazione che attiva l'evento è racchiusa in un blocco di transazione, almeno in Rotaie> = 3.2. Non sarà chiamato altrimenti. –

+0

Questo non è lo stesso. Nella transazione 'after_save' non è ancora stata effettuata alcuna commit, nella transazione' after_commit' è già stata effettuata. – yivo

+0

'* _commit' viene attivato solo in un blocco di transazione. Non si innesca quando si salva. – fantasticfears

Problemi correlati