Я знаю, що давно це питання було задано давно, але я маю додаткову відповідь, якою хочу поділитися.
У мене є кілька додатків Ruby, які були розроблені іншим програмістом протягом декількох років, і вони повторно використовують однакові класи в різних програмах, хоча вони можуть отримати доступ до однієї бази даних. Оскільки це порушує правило СУХОГО, я вирішив створити бібліотеку класів, якою будуть користуватися всі додатки Ruby. Я міг би помістити його в основну бібліотеку Ruby, але це приховало б власний код у загальній кодовій базі, що я не хотів робити.
У мене була проблема, коли у мене виник конфлікт імен між уже визначеним іменем "profile.rb" та класом, яким я користувався. Цей конфлікт не був проблемою, поки я не спробував створити загальну бібліотеку коду. Зазвичай Ruby спочатку шукає місця розташування додатків, а потім переходить до розташувань $ LOAD_PATH.
Application_controller.rb не зміг знайти клас, який я створив, і видав помилку у вихідному визначенні, оскільки це не клас. Оскільки я видалив визначення класу з розділу програми / моделей програми, Ruby не зміг його знайти там і пішов шукати його в шляхи Ruby.
Отже, я змінив змінну $ LOAD_PATH, щоб включити шлях до каталогу бібліотеки, який я використовував. Це можна зробити у файлі environment.rb під час ініціалізації.
Навіть з додаванням нового каталогу до шляху пошуку, Ruby видавав помилку, оскільки переважно спочатку брав визначений системою файл. Шлях пошуку у змінній $ LOAD_PATH переважно здійснює пошук шляхів 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)}