2011-09-16 13 views
49

¿Es posible definir una devolución de llamada before_save en un módulo? De tal manera que con una clase como esta:¿Es posible definir una devolución de llamada 'before_save' en un módulo?

class Model 
    include MongoMapper::Document 
    include MyModule 
end 

y un módulo de la siguiente manera:

module MyModule 
    before_save :do_something 

    def do_something 
    #do whatever 
    end 
end 

do_something se llamará antes de guardar cualquier Model objetos? Lo intenté así, pero obtenga undefined method 'before_save' for MyModule:Module.

Disculpas si es algo simple: soy nuevo en Ruby y en Rails.

Respuesta

95

En rubí en los carriles < 3 (sin barras características, solamente rubí)

module MyModule 
    def self.included(base) 
    base.class_eval do 
     before_save :do_something 
    end 
    end 

    def do_something 
    #do whatever 
    end 
end 

En rubí en los carriles> = 3 (con rieles Concern característica)

module MyModule 
    extend ActiveSupport::Concern 

    included do 
    before_save :do_something 
    end 

    def do_something 
    #do whatever 
    end 
end 
+1

Funciona perfectamente, ¡gracias! – Russell

+0

¿El enfoque para Rails <3 no funciona en Rails> = 3? Estoy haciendo eso y mi devolución de llamada 'before_validation' no parece ser llamada. – Bradley

+0

Funcionará también. –

Cuestiones relacionadas