在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.rbgoogle/docs.rb

我有一个类似的问题,让我的模块在Heroku上运行。 除了Stephen C所声明的自动加载命名约定之外,我还发现,由于Heroku上Rails生产环境的threadsafe假设,必须require模块代码(即使在我的production.rb注释了threadsafeconfiguration文件)。只要在模块调用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具体