before_destroy
, validates
, etc. no son atributos ni nada de eso. Estas son llamadas a métodos.
En ruby, el cuerpo de una clase es todo código ejecutable, lo que significa que cada línea del cuerpo de la clase es ejecutada por el interpetador como lo haría un cuerpo de método.
before_destroy :my_func
es una llamada a método Ruby habitual. El método que se llama es before_destroy
, y recibe un símbolo :my_func
como argumento. Este método se busca en la clase (o módulo) en el ámbito del cual se llama.
Pasemos ahora a su pregunta, creo que ahora usted debe entender que cuando el intérprete se carga el módulo de
module MyModule
before_destroy :my_func #!
def my_func
...
end
end
de que comience la ejecución de su cuerpo y busca el método before_destroy
en este módulo y no puede encontrar uno. Lo que quiere hacer es llamar a este método no en el módulo, sino en la clase donde está incluido el módulo. Para eso tenemos una expresión común usando el método Module#included
:
module MyModule
module InstanceMethods
def my_func
...
end
end
def self.included(base)
base.send :include, InstanceMethods
base.before_destroy :my_func
end
end