Bu sorunun ilk sorulmasından bu yana uzun zaman geçtiğini biliyorum, ancak paylaşmak istediğim ek bir cevabım var.
Birkaç yıl boyunca başka bir programcı tarafından geliştirilmiş birkaç Ruby uygulamam var ve aynı veritabanına erişebilseler de aynı sınıfları farklı uygulamalarda yeniden kullanıyorlar. Bu, DRY kuralını ihlal ettiğinden, tüm Ruby uygulamaları tarafından paylaşılacak bir sınıf kitaplığı oluşturmaya karar verdim. Bunu ana Ruby kitaplığına koyabilirdim, ancak bu, yapmak istemediğim ortak kod tabanındaki özel kodu gizlerdi.
Önceden tanımlanmış bir "profile.rb" adıyla kullandığım sınıf arasında bir ad çakışması yaşadığım bir sorun yaşadım. Ortak kod kitaplığını oluşturmaya çalışana kadar bu çakışma bir sorun değildi. Normalde Ruby önce uygulama konumlarını arar, ardından $ LOAD_PATH konumlarına gider.
Application_controller.rb oluşturduğum sınıfı bulamadı ve bir sınıf olmadığı için orijinal tanıma bir hata verdi. Sınıf tanımını uygulamanın app / models bölümünden kaldırdığım için Ruby onu orada bulamadı ve Ruby yollarında aramaya başladı.
Bu yüzden, kullandığım kütüphane dizininin yolunu içerecek şekilde $ LOAD_PATH değişkenini değiştirdim. Bu, başlatma zamanında environment.rb dosyasında yapılabilir.
Arama yoluna eklenen yeni dizinle bile, Ruby bir hata atıyordu çünkü tercihen sistem tanımlı dosyayı önce alıyordu. $ LOAD_PATH değişkenindeki arama yolu tercihen önce Ruby yollarını arar.
Bu nedenle, arama sırasını değiştirmem gerekiyordu, böylece Ruby yerleşik kitaplıkları aramadan önce sınıfı ortak kitaplığımda bulmuştu.
Bu kod bunu environment.rb dosyasında yaptı:
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
Bu seviyede daha önce verilen gelişmiş kodlama yapılarından herhangi birini kullanabileceğinizi sanmıyorum, ancak uygulamanızda başlatma zamanında bir şey kurmak istiyorsanız gayet iyi çalışıyor. Yeni değişkene geri eklendiğinde, orijinal $ LOAD_PATH değişkeninin orijinal sırasını korumalısınız, aksi takdirde bazı ana Ruby sınıfları kaybolur.
Application_controller.rb dosyasında yalnızca bir
require 'profile'
require 'etc'
ve bu, tüm uygulama için özel kitaplık dosyalarını yükler, yani her denetleyicide gerekli komutları kullanmak zorunda değilim.
Benim için aradığım çözüm buydu ve bilgiyi iletmek için bu yanıta ekleyeceğimi düşündüm.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}