使用ActiveSupport :: Concern使ClassMethods也可用作模块功能

时间:2011-07-08 03:14:49

标签: ruby-on-rails ruby activesupport

给出以下代码:

module Foo
  extend ActiveSupport::Concern

  module ClassMethods
    def foo
      puts 'foo'
    end
  end
end

class Bar
  include Foo
end

我想做的是致电Foo.foo而不是Bar.foo。有时在原始模块上调用类方法会更自然,特别是当功能与包含的类无关时,更好地与原始模块名称一起描述。

1 个答案:

答案 0 :(得分:5)

这似乎是一种代码味道。话虽如此,你可以让Foo模块使用类方法扩展自己:

module Foo
  extend ActiveSupport::Concern

  module ClassMethods
    def foo
      puts 'foo'
    end
  end

  extend ClassMethods
end

class Bar
  include Foo
end

Bar.foo
Foo.foo