Я создаю модуль, расширяющий функциональность модели ActiveRecord.Передача блока динамически созданному методу
Вот моя первоначальная настройка.
Мой класс:
class MyClass < ActiveRecord::Base
is_my_modiable
end
И Модуль:
module MyMod
def self.is_my_modiable
class_eval do
def new_method
self.mod = true
self.save!
end
end
end
end
ActiveRecord::Base(extend,MyMod)
То, что я хотел бы сделать сейчас расширить функциональность new_method
путем передачи в блоке. Что-то вроде этого:
class MyClass < ActiveRecord::Base
is_my_modiable do
self.something_special
end
end
module MyMod
def self.is_my_modiable
class_eval do
def new_method
yield if block_given?
self.mod = true
self.save!
end
end
end
end
Это не работает, и это имеет смысл. В class_eval метод new_method не выполняется, просто определяется, и поэтому оператор yield не будет выполняться до тех пор, пока метод не будет вызван.
Я попытался назначить блок переменной класса в class_eval, а затем вызвать эту переменную класса в этом методе, но блок вызывается на всех моделях is_my_modiable, даже если они не прошли блок в метод.
Я мог бы просто переопределить метод, чтобы получить тот же эффект, но я надеюсь, что есть более элегантный способ.
Не забывайте поднимать их, когда принимаете их ответы. –