我有两个问题。
问题1。
我一直认为文件夹是一个自动命名空间,但我只是回过头来重构一些代码,结果是这样的:
让我感到惊讶的是,我不需要像过去那样在每个文件周围创建命名空间。像:
Module Formatter
Class ActionFormatter
这是因为存在于此文件夹中暗示了Module Formatter吗?在调用它时,我仍然需要将它作为Formatter :: ActionFormatter引用。但是为什么FooFormatter不需要这个参考。
问题2。
一切似乎都有效,但我收到了这个警告:
警告:在我所拥有的行上格式化Formatter :: FormatAction引用的常量FormatAction
@formatter = Formatter::ActionFormatter
为什么会这样?
答案 0 :(得分:5)
不,文件夹本身并未定义名称空间。然而,rails自动加载机制试图在/ b / c.rb中加载非existsint常量A :: B :: C的定义。如果在那里定义另一个常量(特别是没有命名空间),它将存在(没有命名空间)。如果同时存在顶级常量和具有相同名称的命名空间常量,并且您从命名空间中访问此常量,则会收到上述警告。
当你使用rails时,你必须用它们的命名空间定义命名空间常量,如下所示:class A :: B :: C< D.另外,据我所知,继承不会以任何方式影响命名空间。
答案 1 :(得分:0)
@moritz是正确的,对未来的搜索者来说只是一点点补充。
无法加载命名空间控制器
错误:
warning: toplevel constant Finance referenced by Member::Finance
OR
uninitialized constant Finance
原因:
在其依赖项之前列出的命名空间控制器/帮助程序。例如ll member / finance / bank_batches_controller.rb base_controller.rb
修正:
使这成为依赖的第一行:
require_dependency "#{RAILS_ROOT}/app/controllers/member/finance/base_controller"
在尝试加载类之前需要依赖文件。
(是的,这在class ...
)