使用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