Библиотека Rails 3 не загружается, пока не потребуется - PullRequest
24 голосов
/ 21 ноября 2010

Я пытаюсь загрузить Tokbox SDK в rails 3. Я поместил библиотеку в мой каталог / lib, поэтому в настоящее время моя структура каталогов выглядит так:

/ libopentok.rb/ OpenTokExceptions.rbOpenTokSDK.rbSession.rb

Я загружаю все файлы в каталоге / lib с помощью следующего в application.rb:

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 ]

72 голосов
/ 23 июля 2011

Автозагрузка работает нормально, пока класс в вашем файле - это класс, который только определен в этом файле. Он не работает, если вы хотите заново открыть существующий класс (изначально определенный в стандартном 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).

Таким образом, ссылка на константу ActiveRecord::Base в вашем приложении не приведет к автоматической загрузке этого конкретного файла.

Обход:

Это то, что я делаю, чтобы все мои Ruby-файлы в lib/ требовали:

Добавить новый инициализатор с именем config/initializers/require_files_in_lib.rb с таким содержанием:

Dir[Rails.root + 'lib/**/*.rb'].each do |file|
  require file
end
30 голосов
/ 21 ноября 2010

Автозагрузчик будет использовать постоянную, поэтому «OpenTok» заставит автозагрузчик искать «open_tok.rb», а не «opentok.rb». Попробуйте переименовать lib / opentok.rb, и все должно работать нормально.

...