2

我有一个班级和Dog另一个app/models/dog.rb班级Services::My::Deeply::Nested::Dogapp/services/my/deeply/nested/dog.rb

现在在 Services::My (app/services/my.rb) 中,我引用了以下内容之一(无需区分,因为在所有情况下行为都是完全相同的):

  • Deeply::Nested::Dog
  • Services::My::Deeply::Nested::Dog
  • ::Services::My::Deeply::Nested::Dog

无论我选择上述哪个,我总是收到以下错误消息:

services/my.rb:警告:顶级常量 Dog 引用Services::My::Deeply::Nested::Dog

此外,我的深度嵌套的 Dog 甚至从未被解释器看到(我通过使用 puts 和语法错误发现,没有任何反应)。

可能的解决方法(我都不喜欢)是:

  • 重命名 Dog 类之一
  • 使用 RAILS_ENV=production 运行以禁用自动加载并改用急切加载
  • require_dependency那指向深深嵌套的狗

作为一名计算机科学家,我发现上述解决方法都不令人满意。我想了解为什么在没有解决方法的情况下找不到我的深度嵌套的 Dog,并找出最先进的 Ruby/Rails 解决方案是解决这个问题的。

提前非常感谢。

4

1 回答 1

1

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 
于 2016-12-02T10:57:52.163 回答