2012-10-27 43 views
2

我使用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",即使我在MyClass推翻了my_method即包括MyModule(你可以在上面的代码读取)。它是否发生是因为它在类之前加载了视图?或者是什么?我应该如何处理这种情况才能使MyClass正确覆盖my_method

+0

“@ my_class”持有一个类型为“Class”的常量,还是它是类的一个实例? – iain

+0

@Iain - '@ my_class'是'MyClass'的一个实例。 – user12882

+0

好的,只是检查:) – iain

回答

2

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

如果不透露任何,去的地方在你的代码中的异常从哪里来,并添加一些调试打印语句:

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

看看,在控制台打印。

+0

这几乎是我在这个问题上写的。也许问题与其他包含的模块有关。 – user12882

+0

我建议的调试打印语句在Rails控制台中显示了什么? –

相关问题