ऑटोलोडिंग सामान का जादू
मुझे लगता है कि उन फ़ोल्डरों को नियंत्रित करने का विकल्प जिसमें से ऑटोलेडिंग सामान हो जाता है, को अन्य उत्तरों में पर्याप्त रूप से कवर किया गया है। हालाँकि, यदि किसी अन्य व्यक्ति को मुसीबत में सामान रखने में कठिनाई हो रही है, जबकि उनके ऑटोलैड पथ को आवश्यकतानुसार संशोधित किया गया है, तो यह उत्तर यह समझाने की कोशिश करता है कि इस ऑटोलॉड चीज़ के पीछे क्या जादू है।
इसलिए जब उपनिर्देशिका से सामान लोड करने की बात आती है तो एक गोच या एक सम्मेलन होता है जिसे आपको पता होना चाहिए। कभी-कभी रूबी / रेल्स का जादू (इस बार ज्यादातर रेल्स) यह समझने में मुश्किल कर सकता है कि कुछ क्यों हो रहा है। ऑटोलोड पथों में घोषित कोई भी मॉड्यूल केवल तभी लोड किया जाएगा जब मॉड्यूल नाम मूल निर्देशिका नाम से मेल खाता हो। तो मामले में आप lib/my_stuff/bar.rb
कुछ इस तरह की कोशिश करते हैं:
module Foo
class Bar
end
end
इसे स्वचालित रूप से लोड नहीं किया जाएगा। फिर अगर आप माता-पिता का नाम बदलकर foo
इस प्रकार अपने मॉड्यूल को पथ पर होस्ट कर रहे हैं lib/foo/bar.rb
:। यह तुम्हारे लिए वहाँ होगा। एक अन्य विकल्प उस फ़ाइल का नाम है जिसे आप मॉड्यूल नाम से ऑटोलॉइड चाहते हैं। जाहिर है कि उस नाम से केवल एक फ़ाइल हो सकती है। मामले में आपको अपने सामान को कई फाइलों में विभाजित करने की आवश्यकता होती है जो आप निश्चित रूप से उस एक फाइल का उपयोग कर सकते हैं जो अन्य फ़ाइलों की आवश्यकता होती है, लेकिन मैं इसकी सिफारिश नहीं करता हूं, क्योंकि तब जब विकास मोड पर होता है और आप उन अन्य फाइलों को संशोधित करते हैं तो रेल स्वचालित रूप से असमर्थ है उन्हें आपके लिए पुनः लोड करें। लेकिन अगर आप वास्तव में चाहते हैं कि आपके पास मॉड्यूल नाम से एक फ़ाइल हो सकती है जो तब मॉड्यूल का उपयोग करने के लिए आवश्यक वास्तविक फ़ाइलों को निर्दिष्ट करता है। तो आपके पास दो फाइलें हो सकती हैं: lib/my_stuff/bar.rb
और lib/my_stuff/foo.rb
पूर्व ऊपर की तरह ही हो और बाद वाली एक ही लाइन से युक्त हो:require "bar"
और बस वही काम करेगा।
पुनश्च मैं एक और महत्वपूर्ण बात जोड़ने के लिए मजबूर महसूस करता हूं। हाल ही में, जब भी मैं चाहता हूं कि लिबरलडेज प्राप्त करने के लिए आवश्यक निर्देशिका में कुछ हो, तो मैं यह सोचना शुरू कर देता हूं कि अगर यह कुछ ऐसा है जो मैं वास्तव में इस परियोजना के लिए विशेष रूप से विकसित कर रहा हूं (जो आमतौर पर है, तो यह किसी दिन हो सकता है कई परियोजनाओं में उपयोग किए गए कोड के "स्थिर" स्निपेट में बदल दें या एक गिट सबमॉड्यूल, आदि .. जिस स्थिति में यह निश्चित रूप से काम करने योग्य फ़ोल्डर में होना चाहिए) तो शायद इसका स्थान पूरी तरह से lib फ़ोल्डर में नहीं है। शायद यह ऐप फ़ोल्डर के तहत एक सबफ़ोल्डर में होना चाहिए · मुझे यह महसूस होता है कि यह चीजों को करने का नया तरीका है। जाहिर है, एक ही जादू काम में है जहाँ भी आप ऑटोलैड पथ में अपना सामान डालते हैं तो यह इन चीजों के लिए अच्छा है। वैसे भी, इस विषय पर सिर्फ मेरे विचार हैं। आप असहमत होने के लिए स्वतंत्र हैं। :)
अद्यतन: जादू के प्रकार के बारे में ..
जैसा कि गंभीर ने अपनी टिप्पणी में कहा, कोर "ऑटोलॉड एक मॉड्यूल तंत्र" निश्चित रूप से रूबी का हिस्सा है, लेकिन ऑटोलॉड पथ सामान नहीं है। आपको करने के लिए रेल की आवश्यकता नहीं हैautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
। और जब आप पहली बार मॉड्यूल फू को संदर्भित करने की कोशिश करेंगे तो यह आपके लिए लोड होगा। हालाँकि रेल क्या करती है, यह हमें पंजीकृत फ़ोल्डरों से स्वचालित रूप से सामान को लोड करने और लोड करने का एक तरीका देता है और इसे इस तरह से लागू किया गया है कि इसे नामकरण सम्मेलनों के बारे में कुछ ग्रहण करना होगा। यदि यह उस तरह से लागू नहीं किया गया था, तो हर बार जब आप किसी ऐसी चीज का संदर्भ देते हैं जो वर्तमान में लोड नहीं होती है तो उसे सभी ऑटोलैड फ़ोल्डरों में सभी फाइलों से गुजरना होगा और जांचना होगा कि उनमें से किसी में क्या आप संदर्भ के लिए प्रयास कर रहे हैं। यह बदले में ऑटोलिंग और ऑटोरेलोइंग के विचार को हरा देगा। हालाँकि, इन सम्मेलनों के साथ यह मॉड्यूल / वर्ग को आपके लोड करने की कोशिश में कटौती कर सकता है जहां इसे परिभाषित किया जा सकता है और बस इसे लोड किया जा सकता है।
app/lib
।