【问题标题】:Way to load folder as module constant in rails app directory在rails app目录中将文件夹加载为模块常量的方法
【发布时间】:2016-12-01 21:50:10
【问题描述】:

所以有一个 rails 5 项目,想加载这样的目录

/app
  /services
    /user
      foo.rb

作为常量 ::Services::User::Foo

有没有人有让rails自动加载路径以这种方式加载常量的经验?


foo.rb

module Services
  module User
    class Foo

    end
  end
end

解决方案

将此添加到您的 application.rb 文件中

config.autoload_paths << Rails.root.join('app')

在此处查看有关自动加载的讨论

https://github.com/rails/rails/issues/14382#issuecomment-37763348 https://github.com/trailblazer/trailblazer/issues/89#issuecomment-149367035

【问题讨论】:

  • foo.rb 里面有什么?一个类,一个模块,松散的方法?
  • 类是怎么命名的? Foo,不在模块内?
  • 这将是模块下的一个类 (Services::User),只是用示例更新了问题

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

自动加载

你需要在app/services/services/user/foo.rb里面定义Services::User::Foo

如果您不希望出现这种奇怪的子文件夹重复,您也可以将services 移动到app/models/serviceslib/services

您也可以将foo.rb 保留在app/services/user/foo.rb 中,但它应该定义User::Foo

预加载

如果您不需要命名空间和类名的任何魔法,这非常简单:

Dir[Rails.root.join('app/services/**/*.rb')].each{|rb| require rb}

这将急切地加载 app/services 和任何子文件夹中的任何 Ruby 脚本。

【讨论】:

  • 感谢您抽出宝贵时间回答,我希望它与自动加载路径一起使用,以便在文件更改时重新加载,当我这样做时 config.autoload_paths += Dir[File.join( Rails.root,'app/services')] 常量不显示
  • 对于上面的自动加载示例,这应该是开箱即用的,无需添加到 autoload_paths b/c 应用程序目录中的所有文件夹默认情况下都在那里。我的想法是必须有一种方法可以在没有双重嵌套的情况下做到这一点
  • app 中的子文件夹不被平等对待。 app/models/user.rb 没有定义 Models::User 而只是 User 例如。
  • 酷,我明白/明白你在说什么。我在想可能有某种方法可以告诉 ActiveSupport 将文件夹作为模块加载。
  • github.com/rails/rails/issues/14382#issuecomment-37763348 这可能会,会在这里检查一下并更新
猜你喜欢
  • 2011-03-22
  • 2012-01-01
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多