如何将类级方法扩展到Rails中的单独模块?

时间:2010-02-09 21:08:07

标签: ruby-on-rails ruby class module

鉴于以下情况:

module Extension
  def self.included(recipient)
    recipient.extend(ModelClassMethods)
  end

  module ModelClassMethods
    def self.msg
      puts 'Hi from module'
    end
  end
end

class B
  include Extension
end

为什么B.msg不可用?

>> B.msg
NoMethodError: undefined method `msg' for B:Class
    from (irb):16

我是否以错误的方式思考这个问题?看起来这应该不是那么难以完成。

1 个答案:

答案 0 :(得分:4)

msg模块中的ModelClassMethods方法应该声明为实例方法而不是类方法,因为扩展收件人类的行为已经使它成为类方法。所以:

module Extension 
  def self.included(recipient) 
    recipient.extend(ModelClassMethods) 
  end 

  module ModelClassMethods 
    def msg # Note lack of 'self.' 
      puts 'Hi from module' 
    end 
  end 
end