我正在尝试在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中加载库的正确方法是什么?
答案 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,它应该可以正常工作。