Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 什么';在Rails中需要一个完整的目录树是一个好方法吗?_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 什么';在Rails中需要一个完整的目录树是一个好方法吗?

Ruby on rails 什么';在Rails中需要一个完整的目录树是一个好方法吗?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,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 ... 基于谷歌搜索,我尝试: config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib

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

更新

谢谢你的评论

我把它放在我的
应用程序中。rb

Dir["#{Rails.root.to_s}/lib/**/*.rb"].each { |file| config.autoload_paths += [file] }
应用程序启动,但“我的库”中声明的类不可用:

> MyClass
NameError: uninitialized constant MyClass

自动加载路径必须是显式路径——它们不能包含全局文件(通配符)

因此,您必须首先进行扩展:

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

自动加载路径
和好友仅当给定文件或给定目录中的文件根据rails命名约定命名时才起作用

e、 g.如果一个文件
some_class.rb
被赋予
自动加载路径
,它会将该文件导出以声明一个类
SomeClass
,并设置一些魔法,使对
SomeClass
的任何引用都可以动态加载该文件

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

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

Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }
以上内容将读取
/path/to/my/lib
中的每个
.rb
文件及其下的任何目录。

您也可以尝试

application.rb:

  config.autoload_paths += %W( #{config.root}/app/model/super_model )
  config.autoload_paths += %W( #{config.root}/lib )

这里有一种更简单的方法来添加整个lib目录,它不需要
。每个
,并且比其他答案更直观

config.autoload_paths += Dir["#{config.root}/lib/**/"]

请参阅,以获得关于自动加载功能的详细总结。

Dir[“#{Rails.root.to_s}/lib/my_lib/***.rb”]。每个{x|需要x}
对Niklas的建议进行一个小的更改,将require更改为config.autoload_path+=相关的自动加载问题:这与上面Ben Miller的建议有什么不同吗?这对我不起作用。仍在获取“未初始化常量”。(另外,
+=
似乎只适用于另一个数组,因此它看起来需要是
+=[file]
,否则我会得到“无法将字符串转换为数组”。您是正确的。我缺少路径周围的
[]
。“uninitialized constant”错误可能是由于引用的类的文件名不正确。是的,当我对文件名和类名进行排序时,它工作正常。谢谢。请注意,这样做会导致启动时间和内存损失。自动加载的目的是只根据需要加载类。如果这不是真的需要,那么无论如何把上面的代码放在一个初始值设定项中,然后用它来完成!这是正确的答案!我缺少的是传统:)