我刚刚遇到了这个。有(至少?)2可能出现的问题:
查找范围config/application.rb
这条线:
config.autoload_paths += %W(#{config.root}/extras)
如果它的评论,取消注释。该行将打开extras
中的所有文件以及extras
的子目录中的所有文件的自动加载。这可能是最安全的移动你的模块插入extras
,但如果你真的要离开他们lib
,更改行是:
config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib)
- 你的模块是自动加载路径,但不能命名方式Rails的预计
(看到这一点:Rails 2.3.5: How does one access code inside of lib/directory/file.rb?)
按照惯例,Rails的希望你的模块的名称的目录^ h匹配层次结构和文件名。因此,该文件extras/mylib.rb
预计将包含
module Mylib # not MyLib or My_lib
...
end
这适用于子目录为好,这样一个文件extras/mydir/mylib.rb
应包含:
module Mydir
module Mylib # or class Mylib
...
end
end
这个命名约定一致,那么Rails的预计,控制器和楷模。文件名中的下划线变成camelcase类/模块名称。一个名为my_lib.rb
的文件预计会有一个module MyLib
(但不包括Mylib
)。
注意是自动加载并不意味着模块在启动时自动加载;相反,它在第一次使用时会自动加载。因此,即使您在mylib.rb
文件的顶部有puts "hi from mylib"
之类的代码,在代码使用Mylib
之前,您也不会看到该打印。
最后,如果你真的想你的模块在启动时加载,去创建一个名为config/initializers/force_load_libraries.rb
文件,并把这个在那里:
Dir.glob("#{Rails.root}/extras/force_load/*.rb").each { |f| require f }
现在去把你的库中extras/force_load
,他们应该在负载Rails启动。
+1。我想知道更多关于如何在Rails 3.1中测试自定义模块 – brutuscat
我做了rake环境测试:单元,但它仍然无法工作。我认为这应该是加载环境,但它仍然没有工作 – serengeti12
我做了什么(使用RSpec2而不是Test:Unit),让我的模块抓取到extras /文件夹中,如下所示:extras/crawl/module.rb是在我的spec文件夹中添加重复的这些路径,如spec/extras/crawl/module_spec.rb。然后我还创建了一个初始化程序,它需要像“crawl/string”这样的自定义设置。认为我的自定义类是自动加载在我的application.rb config.autoload_paths + =%W(#{config.root}/extras) – brutuscat