如何正确覆盖模块混合的方法?

时间:2012-10-27 14:05:42

标签: ruby-on-rails ruby module include override

我正在使用Ruby 1.9.2和Ruby on Rails 3.2.2。我有以下情况:

class MyClass < ActiveRecord::Base
  include MyModule1
  include MyModule2
  include ...

  # Note: This method statement should override the method mixedin by MyModule1.
  def my_method(*args)
    # ...
  end
end

module MyModule1
  def my_method(*args)
    raise "NotImplementedError - The :my_method is not implemented yet"
  end
end

# /app/views/layouts/application.html.erb
if @my_class.my_method
  All right!
end

当我启动浏览网页的Web应用程序时,我收到错误"NotImplementedError - The :my_method is not implemented yet",即使我覆盖my_method中包含MyClass的{​​{1}}(就像你一样)可以阅读上面的代码)。是否会因为它在课前加载视图?或者是什么?我应该如何处理这种情况,以使MyModule正确覆盖MyClass

1 个答案:

答案 0 :(得分:2)

必须有比此处显示的内容更多的内容,因为您在此处显示的代码肯定不会从#my_method调用MyModule1。请仔细检查def my_method中的MyClass是否拼写错误,并且它实际上发生在class MyClass块中,而不是嵌套class << self块内或类似的块中

如果没有显示任何内容,请转到代码中出现异常的位置,并添加几个调试打印语句:

<% p @my_class.class %>
<% p @my_class.class.ancestors %>

查看在控制台中打印的内容。