2

我的应用程序代码在 Rails 3.2 中的结构如下所示。如果我进入 Rails 控制台并输入Foo::Bar::FooBar它将返回此警告:

warning: toplevel constant FooBar referenced by Foo::Bar::FooBar

应用程序代码和它们位于的文件:

# app/models/foo/bar/foo_bar.rb
module Foo
  class Bar
    class FooBar
    end
  end
end

# app/models/foo/bar.rb
module Foo
  class Bar
  end
end

# app/models/foo_bar.rb
class FooBar
end

我的自动加载路径没有从 Rails 的默认值改变。

我能够解决此问题的一种方法是将以下代码添加到Foo::Bar::FooBar. 但是,感觉很脏,我想知道是否有配置选项或我做错的其他事情可以解决问题。

# app/models/foo/bar/foo_bar.rb
module Foo
  # This line of code removes the warning and makes class methods execute
  # on the Foo::Bar::FooBar class instead of the FooBar class.
  class Bar; end

  class Bar
    class FooBar
    end
  end
end
4

1 回答 1

0

基本问题是您在重叠范围内为不同的类重用相同的名称。你也许可以做一些聪明的事情来让 Ruby 以你想要的方式解析常量名,但是这种“解决方案”从根本上来说是脆弱的。(如果新版本的 Ruby 对常量的查找方式进行了微小的更改,或者您转向另一个 Ruby 实现怎么办?)

为什么不直接命名模块中的顶级FooBar模型类?(您必须将文件移动到与模块同名的子目录中。)

于 2012-11-14T21:24:26.087 回答