Rails 3库直到require才加载

时间:2010-11-21 00:27:35

标签: ruby-on-rails-3 require

我正在尝试在rails 3中加载Tokbox SDK。我已将库放在我的/ lib目录中,所以目前我的目录结构如下:

/ lib中
opentok.rb
/ OpenTok
Exceptions.rb
OpenTokSDK.rb
Session.rb

我正在使用application.rb中的以下内容加载/ lib目录中的所有文件:

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

我在/ lib目录中的其他文件自动加载就好了,但是在我添加require 'OpenTok'之前这个库没有加载:

ruby-1.9.2-p0 > OpenTok
NameError: uninitialized constant OpenTok
ruby-1.9.2-p0 > OpenTok::OpenTokSDK
NameError: uninitialized constant OpenTok
ruby-1.9.2-p0 > require 'OpenTok'
 => ["OpenTok"]
ruby-1.9.2-p0 > OpenTok
 => OpenTok
ruby-1.9.2-p0 > OpenTok::OpenTokSDK
 => OpenTok::OpenTokSDK 

在Rails 3中加载库的正确方法是什么?

2 个答案:

答案 0 :(得分:72)

只要文件中的类是仅在该文件中定义的 的类,自动加载就可以正常工作。如果您想要重新打开现有类(最初在标准Ruby,Rails或其他库中定义)并以某种方式对其进行自定义,则它不起作用。

问题示例:

以下是lib /中永远不会自动加载的文件示例:

lib/active_record/base_extensions.rb

ActiveRecord::Base   # make sure ActiveRecord::Base is loaded
module ActiveRecord::Base::Extensions
  # some methods here
end

class ActiveRecord::Base
  include ActiveRecord::Base::Extensions
end

此文件重新打开ActiveRecord::Base并向该类添加一些方法。

什么会触发此文件自动加载?没有!自动加载基于常量,常量ActiveRecord::Base已经已加载(来自activerecord gem)。

因此,引用应用中的常量ActiveRecord::Base 会导致此特定文件自动加载。

解决方法:

我这样做是为了确保lib/下的所有Ruby文件都是必需的:

使用以下内容添加名为config/initializers/require_files_in_lib.rb的新初始值设定项:

Dir[Rails.root + 'lib/**/*.rb'].each do |file|
  require file
end

答案 1 :(得分:30)

自动加载器将蛇形大小写为常量,因此“OpenTok”会使自动加载器查找“open_tok.rb”,而不是“opentok.rb”。尝试重命名lib / opentok.rb,它应该可以正常工作。