在rails app目录中将文件夹作为模块常量加载的方法

Aus*_*tio 9 ruby ruby-on-rails ruby-on-rails-5

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

/app
  /services
    /user
      foo.rb
Run Code Online (Sandbox Code Playgroud)

作为constant :: Services :: User :: Foo

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


foo.rb

module Services
  module User
    class Foo

    end
  end
end
Run Code Online (Sandbox Code Playgroud)

将其添加到您的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

Eri*_*nil 10

自动加载

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

如果你不想要这个奇怪的子文件夹重复,你也可以移动servicesapp/models/serviceslib/services.

你也可以留下foo.rbapp/services/user/foo.rb,但它应该定义User::Foo.

渴望加载

如果您不需要任何名称空间和类名称的魔术,那么它非常简单:

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

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