使用Rails自动加载时,名称与顶级常量冲突
我在app/models/dog.rb
有一个类Dog
,在app/services/my/deeply/nested/dog.rb
另一个类Services::My::Deeply::Nested::Dog
。
现在在Services :: My(app / services / my.rb)中,我引用了以下内容之一(无需区分,因为在所有情况下行为都是相同的):
-
Deeply::Nested::Dog
-
Services::My::Deeply::Nested::Dog
-
::Services::My::Deeply::Nested::Dog
无论我选择哪一个,我总是收到以下错误消息:
services / my.rb:warning:toplevel constant由
Services::My::Deeply::Nested::Dog
引用的Services::My::Deeply::Nested::Dog
此外,我深深嵌套的狗甚至从未被解释者看到(我通过使用put和语法错误发现,没有任何反应)。
可能的解决方法(我都不喜欢)是:
- 重命名其中一个Dog类
- 使用RAILS_ENV = production运行以禁用自动加载并使用预先加载
-
require_dependency
指向深层嵌套的狗
作为一名计算机科学家,我发现上述解决方法都不令人满意。 我想了解为什么没有解决方法就找不到我深深嵌套的Dog,并找出最先进的Ruby / Rails解决方案对于这个问题。
非常感谢提前。
app/services/my/deeply/nested/dog.rb
应该定义My::Deeply::Nested::Dog
而不是Services::My::Deeply::Nested::Dog
,原因与app/models/dog.rb
没有定义Models::Dog
而只是Dog
。
用:
#app/services/my/deeply/nested/dog.rb module My module Deeply module Nested class Dog puts "I'm in %s" % __FILE__ puts Module.nesting.inspect end end end end
和
# app/models/dog.rb class Dog puts "I'm in %s" % __FILE__ puts Module.nesting.inspect end
和
# app/services/my.rb module My puts "I'm in %s" % __FILE__ puts Module.nesting.inspect Dog My::Deeply::Nested::Dog end
你得到 :
Loading development environment (Rails 5.0.0.1) 2.3.1 :001 > My I'm in /home/ricou/www/new_rails_5_app/app/services/my.rb [My] I'm in /home/ricou/www/new_rails_5_app/app/models/dog.rb [Dog] I'm in /home/ricou/www/new_rails_5_app/app/services/my/deeply/nested/dog.rb [My::Deeply::Nested::Dog, My::Deeply::Nested, My::Deeply, My] => My