Я знаю, что прошло много времени с тех пор, как этот вопрос впервые был задан, но у меня есть дополнительный ответ, которым я хочу поделиться.
У меня есть несколько приложений на 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 в каждом контроллере.
Для меня это было решение, которое я искал, и я подумал, что добавлю его в этот ответ, чтобы передать информацию.