在Rails 3中将lib添加到'config.autoload_paths'不会自动加载我的模块
我把一个文件名g.rb放在Rails.root/lib
文件夹中。文件内容是这样的:
module Google end
然后我补充一下
config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)
到我的Rails.root/config/application.rb
但是,当我尝试从rails console
调用Google时,会引发exception。 只有当我执行require 'google'
,exception消失。 为什么? 我的文件不应该自动加载,不应该访问该模块没有任何额外的require
声明?
嗯,我发现了一个有趣的事情。 为了让Rails自动加载我的类,类名应该与文件名和文件夹结构兼容。 例如,如果我想让Google模块自动加载,那么我必须将它放在google.rb
,直接放在/ lib下(我指定从/ lib中自动加载)。 如果我想自动加载Google::Docs
,那么我可以将它放在google.rb
或google/docs.rb
我有一个类似的问题,让我的模块在Heroku上运行。 除了Stephen C所声明的自动加载命名约定之外,我还发现,由于Heroku上Rails生产环境的threadsafe
假设,必须require
模块代码(即使在我的production.rb
注释了threadsafe
configuration文件)。只要在模块调用include
之前require
'd'模块文件,一切都开始工作。
require 'mymodule' include Mymodule
请看看这个关于在Heroku(生产)中正确加载模块的主题的优秀文章 。
这是因为自动加载的关键不是 “要求”所有的东西(启动罚款)。 类是根据需要/引用加载的。 为了做到这一点,你需要一些方法来知道在哪里寻找类。 否则,您将不得不提前加载autoload目录中的每个文件,以查看声明了哪些类。 这是一个权衡,但要求一切事先(如marbaqbuild议)不是自动加载。 你可以使用Ruby提供的autoload命令,它带有两个参数,模块加载(象征性的,即:Google),第二个参数是文件名,如果lib在你的加载path($ :)。 看到自动加载的Ruby文档。
将config.autoload_paths
更改为config.eager_load_paths
(基于Rails的问题#6850和强制重新加载!从rails 3.2控制台的lib目录中 )
我刚刚面对同样的问题,而我的“解决scheme”(或者说是解决方法)是手动要求我的application.rb中的Rails.root / lib中的每个需要的文件。
require 'lib/message' require 'lib/store' require 'lib/vault/vault.rb' require 'lib/custom_loggers' module MyApplication class Application < Rails::Application
我提到的下一步就是将模块文件夹中的文件分类。
我最近发现这个解决scheme
configuration/ application.rb中
module AppName class Application < Rails::Application # Custom directories with classes and modules you want to be autoloadable. config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')] config.autoload_paths += Dir[Rails.root.join('app', 'lib', 'extensions')] end end
第一次configuration调用诱导钢轨自动加载应用程序/ models目录的所有子目录,所以现在我可以有/app/models/sub_directory/model.rb自动加载(方便地组织一个应用程序与一个大的代码库)
第二个configuration调用会导致rails自动加载lib / extensions目录
希望这可以帮助
注意:我相信这是轨道3具体