在Rails中需要整个目录树的好方法是什么?

Eth*_*han 5 ruby ruby-on-rails ruby-on-rails-3

我正在使用Rails 3.2.2并希望以递归方式加载某个目录中的所有代码.例如:

[Rails root]/lib/my_lib/my_lib.rb
[Rails root]/lib/my_lib/subdir/support_file_00.rb
[Rails root]/lib/my_lib/subdir/support_file_01.rb
...    
Run Code Online (Sandbox Code Playgroud)

基于谷歌搜索,我试过:

config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**/"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**/*"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/{**}"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/{**}/"]
Run Code Online (Sandbox Code Playgroud)

这些都没有加载任何代码,我得到"未初始化的常量"错误.

这直接加载文件/my_lib/,但不加载子目录:

config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib"]
Run Code Online (Sandbox Code Playgroud)

UPDATE

感谢您的评论.

我把它放在我的application.rb:

Dir["#{Rails.root.to_s}/lib/**/*.rb"].each { |file| config.autoload_paths += [file] }
Run Code Online (Sandbox Code Playgroud)

应用程序启动但我的库中声明的类不可用:

> MyClass
NameError: uninitialized constant MyClass
Run Code Online (Sandbox Code Playgroud)

Mic*_*ade 10

autoload_paths 和朋友只有在给定文件或给定目录中的文件根据rails命名方案命名时才能工作.

例如,如果some_class.rb给出了一个文件autoload_paths,它会触发文件以声明一个类SomeClass,并设置一些魔法来进行任何引用以SomeClass即时加载该文件.

因此,如果您希望仅在需要时加载每个文件,则必须相应地命名文件,并且每个类都有一个文件.

如果您乐意在rails启动时加载目录树中的所有文件,则可以执行以下操作:

Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }
Run Code Online (Sandbox Code Playgroud)

上面将读取其中的每个.rb文件/path/to/my/lib及其下的任何目录.