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

标签 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

我是不是想错了?这似乎并不难完成。

最佳答案

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

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

关于ruby-on-rails - 如何将类级方法扩展到 Rails 中的单独模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232535/

相关文章:

c++ - 查看对象是什么类

ruby-on-rails - rake 中止! Gem::LoadError:找不到 rspec 'x' 但确实找到了 'y'

ruby-on-rails - 在 ruby​​ 中评估 SCSS (SASS) 模板(Rails 元素)

ruby - 举例来说,Ruby 中的 print 和 puts 有什么区别?

c++ - 如何验证数据类型输入

带有初始化列表的 C++ 委托(delegate)构造函数。发生了哪些初始化?

ruby-on-rails - 如何为我的 rails 应用程序扩展 sidekiq 性能。需要每秒运行 100 个 sidekiq 作业

ruby-on-rails - 升级到 Rails 3.1.1 时出错

ruby-on-rails - 在 Rails 中使用准备好的语句插入多行

Rubymine 无法识别已安装的 gem