未初始化的常量试图重新打开一个类

时间:2011-09-20 17:50:47

标签: ruby-on-rails ruby

我在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

2 个答案:

答案 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