我在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)
您是否有任何想法如何在模块内的类中添加新方法(这是插件的一部分)?
谢谢你, 的Alessandro
答案 0 :(得分:2)
如果您编写了类和模块名称,那么plugin_module
而不是PluginModule
这违反了ruby / rails标准,并且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
时,这种写入方式才有效。
因此,要么添加正确的require,要么将模块重命名为标准rails命名,或者按如下方式编写:
module plugin_module
class class_inside_module
这种方式也有效,因为现在订单不再重要。 如果尚未知道该模块,则还将定义该模块。 您要么重新打开该类,要么首先定义它(实际的定义实际上会重新打开它)。
希望这会有所帮助。
答案 1 :(得分:1)
您是否尝试重新打开包装类的模块,而不是依赖于::?
module plugin_module
class class_inside_module
def new_method
puts 'new_method'
end
end
end
顺便说一下,你知道模块和类的正确名称是使用带有大写首字母的CamelCase吗?
module PluginModule
class ClassInsideModule
def new_method
puts 'new_method'
end
end
end