gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:49 29 4
gpt4 key购买 nike

我正在使用 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
...

基于谷歌搜索,我试过:

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/{**}/"]

这些都不加载任何代码,我得到“未初始化常量”错误。

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

config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib"]

更新

感谢评论。

我把它放在我的 application.rb 中:

Dir["#{Rails.root.to_s}/lib/**/*.rb"].each { |file| config.autoload_paths += [file] }

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

> MyClass
NameError: uninitialized constant MyClass

最佳答案

autoload_paths 和它的 friend 只有在给定文件或给定目录中的文件根据 rails 命名约定命名时才有效。

例如如果将文件 some_class.rb 提供给 autoload_paths,它会期望文件声明一个类 SomeClass,并设置一些魔法来使任何引用 SomeClass 即时加载该文件。

因此,如果您想让它只在需要时加载每个文件,那么您将必须相应地命名文件,并且每个类一个文件。

如果您愿意在 rails 启动时加载目录树中的所有文件,您可以这样做:

Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }

上面的代码将读取/path/to/my/lib 中的每个.rb 文件,以及它下面的任何目录。

关于ruby-on-rails - 在 Rails 中需要整个目录树的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167444/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com