为自定义acts_as添加类方法

时间:2015-04-16 08:18:49

标签: ruby-on-rails ruby-on-rails-4 activesupport-concern

我想在调用acts_as方法时动态添加类方法。我的文件结构如下(取自http://guides.rubyonrails.org/plugins.html):

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,返回未定义的方法。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为您只需创建第二个子模块并使用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