2011-09-20 35 views
1

我使用Rails中的一个插件,我调用它的方法没有任何问题:未初始化不断试图重新打开类

plugin_module::class_inside_module.method_a(...) 

我想重新打开class_inside_module并添加新的方法,我尝试了许多不同的方式。我想不通为什么以这种方式行不通:

class plugin_module::class_inside_module 
    def new_method 
    puts 'new method' 
    end 
end 

我得到的错误:未初始化的常量plugin_module,但怎么可能,如果我可以毫无问题plugin_module :: class_inside_module.any_methods调用

你知道我为什么得到这个错误吗?为什么“未初始化常量”? (这是一个类的声明:-O)

你有什么想法,我可以添加一个新的方法在模块内的类(这是插件的一部分)?

谢谢 亚历山德罗

+0

我提供了“伪代码”来简化问题,它不是强制性的提供真正的代码。 –

回答

2

如果你写你的类和模块的名字像你这样,这么plugin_module代替PluginModule这是对的Ruby/Rails标准,轨道将无法自动查找类和模块。

如果你喜欢写东西

module MyModule 
    class MyClass 

    end 
end 

Rails会想到这个文件位于lib\my_module\my_class。 但是,这通常可以通过明确地执行require来轻松覆盖。

所以你的情况,当你写

module plugin_module::class_inside_module 

Rails会不知道在哪里可以找到该模块plugin_module。 只有在模块plugin_module已被定义(和加载)时,这种书写方式才有效。

因此,无论添加正确的需要,或为你的模块标准导轨命名,或将其写出如下:

module plugin_module 
    class class_inside_module 

这种方式也将工作,因为现在的顺序不再是问题。 如果模块还不知道,这也将定义模块。 要么您重新开放课程,要么您先定义它(实际的定义实际上会重新打开它)。

希望这会有所帮助。

1

您是否尝试过重新打开包裹真实的类,而不是依赖于::模块?

module plugin_module 
    class class_inside_module 
    def new_method 
     puts 'new_method' 
    end 
    end 
end 

顺便说一句,你知道,模块和类的正确名称是利用驼峰大写首字母?

module PluginModule 
    class ClassInsideModule 
    def new_method 
     puts 'new_method' 
    end 
    end 
end