我在side Rails.root/lib
文件夹中放置了一个名为g.rb的文件,文件内容如下:
module Google
end
然后我补充说
config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)
到我的Rails.root/config/application.rb
但是,当我尝试从rails console
调用Google时,抛出了一个异常。只有当我执行require 'google'
时,异常才会消失。为什么?我的文件不应该是自动加载的吗?我不应该在没有任何额外的require
语句的情况下访问模块吗?
发布于 2010-11-02 12:10:56
嗯,我发现了一件有趣的事。为了让Rails自动加载我的类,类名应该符合文件名和文件夹结构。例如,如果我想要自动加载Google模块,我必须将它放在google.rb
中,直接放在/lib下(如果我指定从/lib自动加载)。如果我想自动加载Google::Docs
,那么我要么将它放在google.rb
中,要么放在google/docs.rb
中
发布于 2011-09-06 13:19:01
我在Heroku上运行我的模块时也遇到了类似的问题。除了Stephen C声明的自动加载命名约定之外,我还发现模块代码必须是require
'd,这是因为Heroku上的Rails生产环境做出了threadsafe
假设(即使threadsafe
在我的production.rb
配置文件中被注释掉了)。当我在模块上调用include
之前对模块文件执行require
操作时,一切都开始正常工作。
require 'mymodule'
include Mymodule
请查看this excellent article关于在Heroku (生产)中正确加载模块的主题。
发布于 2013-07-16 03:35:36
将config.autoload_paths
更改为config.eager_load_paths
(基于Rails issue #6850和Force reload! from lib directory in rails 3.2 console)
https://stackoverflow.com/questions/4074830
复制相似问题