gpt4 book ai didi

ruby-on-rails - 我可以强制 Rails 自动加载命名空间而不嵌套在文件夹中吗?

转载 作者:行者123 更新时间:2023-12-03 02:39:00 27 4
gpt4 key购买 nike

有没有办法告诉 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 中定义 Foo::BarFoo::Quux quux.rb,同时还使用 Rails 自动加载。不必求助于如下的树结构:

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.rbapp/controllers/foo/bar.rb > 等等,直到找到定义 Foo::Bar 的文件。我们所做的就是将 app/foo/bar.rb 添加到该查找中。

关于ruby-on-rails - 我可以强制 Rails 自动加载命名空间而不嵌套在文件夹中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com