Я знаю, что этот вопрос был задан давно, но у меня есть дополнительный ответ, которым я хочу поделиться.
У меня есть несколько приложений Ruby, которые были разработаны другим программистом в течение нескольких лет, и они повторно используют одни и те же классы в разных приложениях, хотя могут обращаться к одной и той же базе данных. Поскольку это нарушает правило DRY, я решил создать библиотеку классов, которая будет использоваться всеми приложениями Ruby. Я мог бы поместить его в основную библиотеку Ruby, но это скроет пользовательский код в общей кодовой базе, чего я не хотел делать.
У меня возникла проблема, связанная с конфликтом имен между уже определенным именем «profile.rb» и классом, который я использовал. Этот конфликт не был проблемой, пока я не попытался создать общую библиотеку кода. Обычно Ruby сначала ищет местоположения приложений, а затем переходит в местоположения $ LOAD_PATH.
Application_controller.rb не смог найти созданный мною класс и выдал ошибку в исходном определении, потому что это не класс. Поскольку я удалил определение класса из раздела app / models приложения, Ruby не смог найти его там и стал искать его в путях Ruby.
Итак, я изменил переменную $ LOAD_PATH, включив в нее путь к каталогу библиотеки, который я использовал. Это можно сделать в файле environment.rb во время инициализации.
Даже с добавлением нового каталога в путь поиска Ruby выдавал ошибку, потому что сначала предпочтительно брал файл, определенный системой. Путь поиска в переменной $ LOAD_PATH в первую очередь ищет пути Ruby.
Итак, мне нужно было изменить порядок поиска, чтобы Ruby нашел класс в моей общей библиотеке до того, как начал поиск во встроенных библиотеках.
Этот код сделал это в файле environment.rb:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
Я не думаю, что вы можете использовать какие-либо расширенные конструкции кодирования, представленные ранее на этом уровне, но они отлично работают, если вы хотите что-то настроить во время инициализации в своем приложении. Вы должны сохранить исходный порядок исходной переменной $ LOAD_PATH, когда она добавляется обратно в новую переменную, иначе некоторые из основных классов Ruby будут потеряны.
В файле application_controller.rb я просто использую
require 'profile'
require 'etc' #etc
и это загружает файлы пользовательской библиотеки для всего приложения, т.е. мне не нужно использовать команды require в каждом контроллере.
Для меня это было решение, которое я искал, и я подумал, что добавлю его к этому ответу, чтобы передать информацию.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}