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

所以有一个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

自动加载

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

如果您不想要这个奇怪的子文件夹重复,您还可以将services移动到app/models/serviceslib/services

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

渴望加载

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

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

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