Saya tahu sudah lama sejak pertanyaan ini pertama kali diajukan, tetapi saya memiliki jawaban tambahan yang ingin saya bagikan.
Saya memiliki beberapa aplikasi Ruby yang dikembangkan oleh programmer lain selama beberapa tahun, dan mereka menggunakan kembali kelas yang sama di aplikasi yang berbeda meskipun mereka mungkin mengakses database yang sama. Karena ini melanggar aturan KERING, saya memutuskan untuk membuat perpustakaan kelas untuk digunakan bersama oleh semua aplikasi Ruby. Saya bisa saja meletakkannya di pustaka Ruby utama, tetapi itu akan menyembunyikan kode khusus dalam basis kode umum yang tidak ingin saya lakukan.
Saya mengalami masalah ketika saya mengalami konflik nama antara nama "profile.rb" yang sudah ditentukan, dan kelas yang saya gunakan. Konflik ini bukanlah masalah sampai saya mencoba membuat pustaka kode umum. Biasanya, Ruby mencari lokasi aplikasi terlebih dahulu, lalu pergi ke lokasi $ LOAD_PATH.
Application_controller.rb tidak dapat menemukan kelas yang saya buat, dan memberikan kesalahan pada definisi asli karena ini bukan kelas. Karena saya menghapus definisi kelas dari bagian app / models pada aplikasi, Ruby tidak dapat menemukannya di sana dan mencarinya di jalur Ruby.
Jadi, saya memodifikasi variabel $ LOAD_PATH untuk memasukkan jalur ke direktori perpustakaan yang saya gunakan. Ini dapat dilakukan di file environment.rb pada saat inisialisasi.
Bahkan dengan direktori baru yang ditambahkan ke jalur pencarian, Ruby memberikan kesalahan karena Ruby lebih memilih mengambil file yang ditentukan sistem terlebih dahulu. Jalur pencarian dalam variabel $ LOAD_PATH secara istimewa mencari jalur Ruby terlebih dahulu.
Jadi, saya perlu mengubah urutan pencarian sehingga Ruby menemukan kelas tersebut di perpustakaan umum saya sebelum mencari di perpustakaan bawaan.
Kode ini melakukannya di file 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
Saya tidak berpikir Anda dapat menggunakan salah satu konstruksi pengkodean lanjutan yang diberikan sebelumnya pada tingkat ini, tetapi berfungsi dengan baik jika Anda ingin menyiapkan sesuatu pada waktu inisialisasi di aplikasi Anda. Anda harus mempertahankan urutan asli variabel $ LOAD_PATH asli ketika ditambahkan kembali ke variabel baru, jika tidak, beberapa kelas Ruby utama akan hilang.
Di file application_controller.rb, saya cukup menggunakan file
require 'profile'
require 'etc' #etc
dan ini memuat file pustaka kustom untuk seluruh aplikasi, yaitu, saya tidak perlu menggunakan perintah require di setiap pengontrol.
Bagi saya, ini adalah solusi yang saya cari, dan saya pikir saya akan menambahkannya ke jawaban ini untuk menyampaikan informasi.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}