我无法理解基于Ruby模块的命名空间应该如何工作。我一直都明白,如果你有两个同名的类,你可以在模块中放一个来澄清名称空间。
目前这不起作用,我不明白为什么。在app/models/something/baz.rb
我有:
class Baz < ActiveRecord::Base
self.table_name = 'baz'
end
我不确定为什么table_name赋值在那里。也许是因为这个文件嵌套在something
?
在lib/foo/bar/baz.rb
我有:
module Foo
module Bar
class Baz
end
end
end
我按顺序在lib/foo
的autoload_paths配置值中包含路径lib/bar
,config/application.rb
:
config.autoload_paths += %W(
#{config.root}/lib
#{config.root}/lib/import
#{config.root}/lib/foo
#{config.root}/lib/foo/bar
#{config.root}/app/models/concerns
#{config.root}/app/services
#{config.root}/app/controllers/concerns
#{config.root}/app
)
在控制台我可以成功引用Foo
,Foo::Bar
模块但是当我尝试Foo::Bar::Baz
时,我得到了常见的错误
期望Baz在lib / foo / bar / baz.rb中定义
现在我将该类更改为lib/foo/bar/baz_thing.rb
并在控制台中将其引用为Foo::Bar::BazThing
一切正常。我得出了可能错误的结论,即自动加载实现可能会混淆,因为有两个具有相同名称的类。
我对所有这些都进行了双重,三重和四重检查的名称和路径。
我还会仔细阅读创建此故障单时显示的所有建议的替代/重复问题,并且找不到能够解决我问题的任何问题。
任何人都可以确定我出错的地方以及为什么我对模块命名空间行为的期望不正确?
这是在ruby 2.2.2和Rails 4.2.6
上