2012-07-18 27 views
9

क्या यह फ़ोल्डर संरचना के साथ मॉड्यूल में सभी फ़ाइलों के लिए रूबी सम्मेलन है (जावा पैकेज के समान)?क्या सभी रूबी फ़ाइलों में एक मॉड्यूल संरचना होनी चाहिए जो फ़ोल्डर संरचना से मेल खाती हो?

उदाहरण के लिए, अगर मैं एक फ़ाइल संरचना है कि लग रहा है जैसे

lib/लोग/utils

यहाँ में फ़ाइलों जैसे मॉड्यूल संरचना होगा:

module People 
    module Utils 
    # some functionality for People::Utils 
    end 
end  

कारण मैं पूछता हूं क्योंकि मैं कुछ रेल कोड के माध्यम से पढ़ रहा हूं, और ऐसा लगता है कि इस तरह की फाइल संरचना में कई फाइलें हैं, लेकिन कोई मॉड्यूल घोषणा नहीं है।

मुझे लगता है कि ऐसा होगा कि आप People::Utils को शामिल किए बिना उपयोगिता फ़ंक्शन का उपयोग कर सकते हैं।

क्या रूबी में एक सम्मेलन है जब मॉड्यूल का उपयोग किया जाना चाहिए और जब उन्हें नहीं करना चाहिए?

उत्तर

4

आमतौर पर कक्षाओं और फ़ाइलों को इस तरह की संरचना में रखना एक अच्छा विचार है, क्योंकि इससे कक्षा के नाम को इसकी परिभाषा में मानचित्र बनाना आसान हो जाएगा।

लेकिन यह समझ में नहीं आता है कि यह करने के लिए (आखिरकार आप अपना कोड बनाते हैं)। मैंने कभी-कभी ऐसा किया है जब बहुत से छोटे वर्ग एक ही चीज़ से निपट रहे थे, मैंने उन्हें एक साथ रखा।

और यह एक फ़ाइल रखने के लिए समझ में आता है जो मॉड्यूल या कक्षा को परिभाषित नहीं करता है, उदा। कॉन्फ़िगरेशन फ़ाइल, या बाइनरी, या बूटस्ट्रैपिंग फ़ाइल (फ़ाइल जो अन्य सभी को लोड करती है)।

12

यह रेल में मानक है। जिस तरह से रेल आपके मॉडलों को लोड करते हैं, वह यह है कि वर्ग संरचना कहां अनुमानित करने के लिए फ़ोल्डर संरचना को देखकर है। हमारे पास autoload_paths तथाकथित है।

आप उन्हें में फोन करके प्राप्त कर सकते हैं अपने rails console (यह एक सा hacky है, उन्हें दिखाने के लिए एक आसान तरीका हो सकता है): अपने config/application.rb config में

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths") 

एक डिफ़ॉल्ट रेल एप्लिकेशन उत्पादन, config.autoload_paths += %W(#{config.root}/lib) बिना ब्लॉक इस प्रकार दिखाई देगा:

["/Users/lunks/Code/rsvp/app/assets", 
"/Users/lunks/Code/rsvp/app/controllers", 
"/Users/lunks/Code/rsvp/app/helpers", 
"/Users/lunks/Code/rsvp/app/mailers", 
"/Users/lunks/Code/rsvp/app/models"] 

इसलिए, यदि आप app/models/something/util.rb है और आप Something::Util कहीं कहते हैं, यह इन रास्तों पर ध्यान देंगे, 01 के साथ app/models/ फ़ोल्डर को खोजनेऔर इसे लोड करें।

दूसरी तरफ रूबी उस परवाह नहीं करते हैं। this page पर वर्णित सादे रूबी में ऑटोलोड लोड करता है। आपको या तो ऑटोलोड का उपयोग करना होगा या फ़ाइलों को सीधे आवश्यकता होगी (और फ़ोल्डर संरचना का मतलब कुछ भी नहीं होगा)।

+0

और बाद में रेल संस्करणों में autoload_paths सूचीबद्ध करने के लिए: 'Rails.application.instance_variable_get (:" @_ all_autoload_paths ")' – valk