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

标签 ruby-on-rails ruby ruby-on-rails-4

有没有办法告诉 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/

相关文章:

ruby-on-rails - 可以将 AWS Gem 与 Paperclip 结合使用用于 DigitalOcean Spaces 服务吗?

html - 在 Rails : "..." showing up on strings at length 中截断字符串

ruby-on-rails - 混合使用 ERB 和 Rails 路径助手编译 YAML

ruby - 列出日期数组中缺失的月份

mysql - 无法将 Rails 4 应用程序与 digitalocean 上的 mysql 数据库连接

ruby - Rails 4 更改标准的事件模型验证消息

ruby-on-rails - Rails 4 - 销毁 HABTM 记录导致 UndefinedTable

ruby-on-rails - Rails 中的过滤表单?

ruby-on-rails - foo.try(& :to_s?) 和 foo.try(:to_s?) 有区别吗

ruby-on-rails - rails : Methods shared by multiple controllers