2015-04-16 7 views
0

Я хочу динамически добавлять методы класса при вызове метода acts_as. Моя файловая структура выглядит следующим образом (взяты из http://guides.rubyonrails.org/plugins.html):Добавить методы класса для custom actions_as

module ActsAsFoo 
    extend ActiveSupport::Concern 

    included do 
    end 

    module ClassMethods 
    def acts_as_foo(options = {}) 
     include ActsAsFoo::LocalInstanceMethods 
    end 
    end 

    module LocalInstanceMethods 
    def instance_method 
     # This method works without any issue 
    end 
    end 
end 

class Bar 
    acts_as_foo 
end 

Я хочу, чтобы иметь возможность объявить методы класса только когда класс называет acts_as_foo. Методы экземпляра работают с LocalInstanceMethods. Самый простой способ - добавить в модуль, но все мои другие классы тоже имеют этот метод. Я уже пытаюсь добавить define_method в метод acts_as, возвращает неопределенный метод. Есть идеи ?

+0

Хотите добавить методы класса или методы экземпляра в 'Bar'? Ваш вопрос говорит о методах класса, но модуль называется 'LocalInstanceMethods' – Slicedpan

+0

@Slicedpan Я не был ясен. Я переписываю свой вопрос. Я могу добавить локальные экземпляры без проблем, но не методы класса. – pierallard

ответ

1

Я думаю, вам просто нужно создать второй подмодуль и использовать extend вместо include

module ActsAsFoo 
    extend ActiveSupport::Concern 

    included do 
    end 

    module ClassMethods 
    def acts_as_foo(options = {}) 
     extend ActsAsFoo::LocalClassMethods 
    end 
    end 

    module LocalClassMethods 
    def class_method 
     # class method definition 
    end 
    end 
end 

class Bar 
    acts_as_foo 
end 
Смежные вопросы