5

Estoy usando Rails 3.1.0 y me gustaría saber si es posible manejar las devoluciones de llamadas after_save y after_destroy "igualmente". Es decir, necesito ejecutar los mismos métodos para callbacks after_save y after_destroy.Hay una manera de manejar `after_save` y` after_destroy` "igualmente"?

En este momento debo manejar esas devoluciones de llamada por separado, incluso si los lograr a lo mismo:

after_save do |record| 
    # Make a thing 
end 

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

Así, hay una manera de manejar after_save y after_destroy "igual"?

+1

llamada el mismo método de ambos? –

+0

@Dave Newton - Los métodos son literalmente los mismos. – Backo

+0

Entiendo eso - es por eso que le dije que llame al mismo método desde ambos, ya sea que esté usando el formulario en su publicación, o desde una referencia de método como en la respuesta. –

Respuesta

20

En lugar de un bloque, proporcione after_save y after_destroy un nombre de método de su modelo como símbolo.

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 clase se define con la palabra clave 'class', no con la palabra clave' def'. – Gazler

+0

@Gazler: bien visto :) – Vapire

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

    private 
    def my_callback 
    #Do stuff 
    end 
end 
+0

Según el caso de uso, 'protected' podría preferirse a' private' – ksol

5

para ejecutar el mismo devolución de llamada después de que tanto el ahorro y la destrucción, puede utilizar after_commit

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

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

+0

Según mi experiencia, esto solo funciona cuando la operación que desencadena el evento está envuelta en un bloque de transacción, al menos en Rieles> = 3.2. No se llamará de otra manera. –

+0

Esto no es lo mismo. En la transacción 'after_save' aún no se ha comprometido, en la transacción' after_commit' ya está comprometida. – yivo

+0

'* _commit' solo se activa en un bloque de transacción. No se dispara cuando "guardas". – fantasticfears

Cuestiones relacionadas