创建文件夹有什么影响,它是一个自动命名空间吗?

时间:2011-05-31 16:21:12

标签: ruby-on-rails ruby

我有两个问题。

问题1。

我一直认为文件夹是一个自动命名空间,但我只是回过头来重构一些代码,结果是这样的:

  • 名为formatter的文件夹
  • 文件formatter.rb,其中包含对文件夹
  • 中所有文件的引用
  • 一个格式化程序/ formatter.rb文件,它有一个Formatter类,没有对名称空间的引用
  • 继承自Formatter类的其他3个类:FooFormatter,BarFormatter,BazFormatter,没有对名称空间的引用
  • 一个ActionFormatter类,它不从类Formatter继承,并且没有对命名空间的引用

让我感到惊讶的是,我不需要像过去那样在每个文件周围创建命名空间。像:

Module Formatter
  Class ActionFormatter

这是因为存在于此文件夹中暗示了Module Formatter吗?在调用它时,我仍然需要将它作为Formatter :: ActionFormatter引用。但是为什么FooFormatter不需要这个参考。

问题2。

一切似乎都有效,但我收到了这个警告:

警告:在我所拥有的行上格式化Formatter :: FormatAction引用的常量FormatAction

@formatter = Formatter::ActionFormatter

为什么会这样?

2 个答案:

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

之前