मुझे पता है कि यह प्रश्न पूछे जाने के बाद एक लंबा समय हो गया है, लेकिन मेरे पास एक अतिरिक्त उत्तर है जिसे मैं साझा करना चाहता हूं।
मेरे पास कई रूबी अनुप्रयोग हैं जो किसी अन्य प्रोग्रामर द्वारा कई वर्षों में विकसित किए गए थे, और वे विभिन्न अनुप्रयोगों में समान कक्षाओं का फिर से उपयोग करते हैं, हालांकि वे एक ही डेटाबेस तक पहुंच सकते हैं। चूंकि यह DRY नियम का उल्लंघन करता है, इसलिए मैंने रूबी के सभी अनुप्रयोगों द्वारा साझा की जाने वाली एक क्लास लाइब्रेरी बनाने का फैसला किया। मैं इसे मुख्य रूबी पुस्तकालय में रख सकता था, लेकिन यह सामान्य कोडबेस में कस्टम कोड छिपाएगा जो मैं नहीं करना चाहता था।
मुझे एक समस्या थी जहां मेरे पास पहले से परिभाषित नाम "profile.rb" के बीच एक नाम संघर्ष था, और एक वर्ग जो मैं उपयोग कर रहा था। जब तक मैंने कॉमन कोड लाइब्रेरी बनाने की कोशिश नहीं की, यह संघर्ष एक समस्या नहीं थी। आम तौर पर, रूबी पहले आवेदन स्थानों को खोजती है, फिर $ LOAD_PATH स्थानों पर जाती है।
Application_controller.rb मेरे द्वारा बनाई गई कक्षा को नहीं ढूंढ सका, और मूल परिभाषा पर एक त्रुटि फेंक दी क्योंकि यह एक वर्ग नहीं है। चूंकि मैंने एप्लिकेशन की एप्लिकेशन / मॉडल अनुभाग से वर्ग परिभाषा को हटा दिया था, रूबी वहां नहीं मिली और रूबी पथों में इसे ढूंढती रही।
इसलिए, मैंने लाइब्रेरी डायरेक्टरी का एक पथ शामिल करने के लिए $ LOAD_PATH चर को संशोधित किया। यह आरंभीकरण समय में environment.rb फ़ाइल में किया जा सकता है।
यहां तक कि नई निर्देशिका के साथ खोज पथ में जोड़ा गया, रूबी एक त्रुटि फेंक रही थी क्योंकि यह पहले से सिस्टम-परिभाषित फ़ाइल को प्राथमिकता से ले रहा था। $ LOAD_PATH चर में खोज पथ अधिमानतः रूबी पथों को पहले खोजता है।
इसलिए, मुझे खोज क्रम में बदलाव करने की आवश्यकता थी ताकि रूबी को मेरे सामान्य पुस्तकालय में कक्षा मिल जाए, इससे पहले कि यह अंतर्निहित पुस्तकालयों की खोज की जाए।
इस कोड ने इसे 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 चर के मूल क्रम को बनाए रखना चाहिए जब इसे नए चर में वापस जोड़ा जाए अन्यथा कुछ मुख्य रूबी वर्ग खो जाते हैं।
Application_controller.rb फ़ाइल में, मैं बस एक का उपयोग करता हूं
require 'profile'
require 'etc' #etc
और यह पूरे आवेदन के लिए कस्टम लाइब्रेरी फ़ाइलों को लोड करता है, अर्थात, मुझे प्रत्येक नियंत्रक में कमांड की आवश्यकता का उपयोग करने की आवश्यकता नहीं है।
मेरे लिए, यह वह समाधान था जिसकी मैं तलाश कर रहा था, और मुझे लगा कि मैं इस उत्तर को इस जानकारी के साथ जोड़ने के लिए जोड़ दूंगा।
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}