有没有办法告诉 Rails 某个文件夹中的所有文件都包含在某个命名空间中?
即。
我在 app/foo
中有一个文件 bar.rb
。 Rails 会假设此文件定义 Bar
,但我希望此文件定义 Foo::Bar
。
我知道我可以通过将我的根添加到 Rails 的自动加载路径来实现此目的,但这不是真正的解决方案。有没有其他方法可以告诉 Rails app/foo
中的所有文件都驻留在 Foo
命名空间中?
编辑:用于澄清的文件树
app
assets
controllers
models
foo
bar.rb
quux.rb
我希望能够分别在 bar.rb
和 中定义
,同时还使用 Rails 自动加载。不必求助于如下的树结构:Foo::Bar
和 Foo::Quux
quux.rb
app
assets
controllers
models
foo
foo
bar.rb
quux.rb
最佳答案
您可以通过将 /app
添加到应用程序配置中的自动加载路径来自动加载 namespace 与 /app
内的目录相对应的文件。
# config/application.rb
config.autoload_paths << "#{config.root}/app"
我不确定这是否是问题作者的意思
I know I can achieve this by adding my root to Rails' autoload paths, but that isn't a real solution.
但这绝对是一个真正的解决方案,也是正确的解决方案。这样做很好,根据我的经验,这并不罕见。
只有很小的副作用,即采用您想要的不一致命名约定的成本。如果您引用与应用程序中另一个目录的名称匹配的未定义常量,您将收到略有不同的错误消息。
# Models::Foo => LoadError (Unable to autoload constant Models::Foo, expected /app/models/foo.rb to define it)
但是,如果您有与 app
中的目录匹配的现有命名空间,加载仍然可以正常工作。这是 Rails 正在做的事情:
它将添加到config.autoload_paths
的路径并将它们添加到默认值(app
下的目录:app/models
,应用程序/ Controller
,应用程序/foo
等)。然后,当引用尚未加载的常量时,Rails 会继续遍历这些路径,寻找与常量匹配的路径。因此,当您引用 Foo::Bar
时,它会查找 app/models/foo/bar.rb
、app/controllers/foo/bar.rb
> 等等,直到找到定义 Foo::Bar
的文件。我们所做的就是将 app/foo/bar.rb
添加到该查找中。
关于ruby-on-rails - 我可以强制 Rails 自动加载命名空间而不嵌套在文件夹中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985064/