before_destroy
, validates
и т. Д. Не являются атрибутами или чем-то подобным.Это вызовы методов.
В ruby все тело класса представляет собой исполняемый код, то есть каждая строка тела класса выполняется интерпретатором так же, как и тело метода.before_destroy :my_func
- это обычный вызов метода ruby.Вызываемый метод - before_destroy
, и он получает символ :my_func
в качестве аргумента.Этот метод ищется в классе (или модуле), в области его вызова
module MyModule
before_destroy :my_func #!
def my_func
...
end
end
он начинает выполнение своего тела и ищет метод before_destroy
в этом модуле и не может найти его.То, что вы хотите сделать, это вызвать этот метод не в модуле, а в классе, в который включен модуль.Для этого у нас есть общая идиома, использующая метод 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