रेल 4: उप-पथ में पटरियों को बिना नाम के मॉडल के व्यवस्थित करें?


80

क्या ऐसा कुछ होना संभव होगा?

app/models/
app/models/users/user.rb
app/models/users/education.rb

लक्ष्य / एप्लिकेशन / मॉडल फ़ोल्डर को बेहतर ढंग से व्यवस्थित करना है, लेकिन मॉडल के नाम स्थान के बिना।

रेल 3 के लिए एक अनुत्तरित प्रश्न यहाँ है: रेल 3.2.9 और सबफ़ोल्डर में मॉडल

नामस्थानों के साथ तालिका_नाम निर्दिष्ट करना काम करने लगता है ( रेल 4 मॉडल सबफ़ोल्डर देखें ), लेकिन मैं नाम के बिना ऐसा करना चाहता हूं


मैं समझ गया कि आप नाम स्थान नहीं चाहते हैं, लेकिन मुझे लगता है कि ActiveSupport चिंता का उपयोग करने का सबसे अच्छा तरीका है।
नंदो सुसा

2
@ नंदोसौसा। सक्रिय व्यवहार के लिए साझा व्यवहार के लिए नहीं हैं। जिस तरह से आप मॉडल का उपयोग करते हैं।
बजे

जवाबों:


116

डिफ़ॉल्ट रूप से, रेल ऑटोलैड पथ के लिए मॉडल निर्देशिका के सबफ़ोल्डर्स को नहीं जोड़ता है। यही कारण है कि यह केवल नामांकित मॉडल पा सकता है - नाम स्थान देखने के लिए उपनिर्देशिका को प्रकाशित करता है।

ऑटोलैड पथ पर एप्लिकेशन / मॉडल के सभी सबफ़ोल्डर्स को जोड़ने के लिए, निम्नलिखित को कॉन्फ़िगर / एप्लिकेशन में जोड़ें ।rb :

config.autoload_paths += Dir[Rails.root.join("app", "models", "{*/}")]

या, यदि आपके पास अधिक जटिल एप्लिकेशन / मॉडल निर्देशिका है, तो ऐप / मॉडल के सभी सबफ़ोल्डर्स को एक साथ ग्लोब करने की उपरोक्त विधि ठीक से काम नहीं कर सकती है। किस स्थिति में, आप इसके बारे में थोड़ा और स्पष्ट होकर और केवल आपके द्वारा निर्दिष्ट सबफ़ोल्डर्स को जोड़कर प्राप्त कर सकते हैं:

config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>")
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")

पटरियों के लिए अद्यतन 4.1+

रेल 4.1 के रूप में, ऐप जनरेटर config.autoload_pathsडिफ़ॉल्ट रूप से शामिल नहीं होता है । तो, ध्यान दें कि उपरोक्त वास्तव में config / application.rb से संबंधित है ।

अपडेट करें

{*/}इसके बजाय उपयोग करने के लिए उपरोक्त कोड में निश्चित ऑटोलोड पथ उदाहरण हैं {**}। इस पर जानकारी के लिए म्यूचिन की टिप्पणी अवश्य पढ़ें ।


6
इसे आज़माया लेकिन यह ऑटोलैड स्थिर उपयोगकर्ता के लिए एक असमर्थ के साथ विफल रहता है :: क्रेडिट, अपेक्षित /srv/books/app/models/user/credits.rb इसे परिभाषित करने के लिए। तो यह अभी भी फ़ाइलों को स्थान नहीं दिया जाएगा। सुझाए गए अनुसार उन्हें प्रवेश के ऊपर रखा।
Rubytastic

1
यह त्रुटि वास्तव में अच्छी खबर है। इसका मतलब है कि यह फ़ाइल मिल गया। लेकिन, आप यहां एक अजीब बहुवचन का उपयोग कर रहे हैं। यदि आपका फ़ाइल नाम है, app/models/user/credits.rbतो सुनिश्चित करें कि फ़ाइल में वर्ग का नाम भी बहुवचन है class Credits:। लेकिन, मैं रेल के मानक का उपयोग करने और इसे बनाने की सिफारिश करूंगा class Creditऔर फ़ाइल का नाम app/models/user/credit.rb(मॉडल एकवचन होना चाहिए) होना चाहिए। किसी भी तरह से, यह समस्या होनी चाहिए। मुझे बताएं!
pdobb

1
config.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
रेलिंग

14
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]काम करता है, लेकिन एप्लिकेशन को धीमा कर देता है, विशेष रूप से विकास मोड में जहां ऐप को अक्सर लोड किया जाता है। कारण यह है कि आपको सभी फ़ाइलों को ऑटोलैड_पैथ में नहीं जोड़ना चाहिए, लेकिन केवल रूट फ़ोल्डर जहां तब फ़ाइल नाम और मॉड्यूल से अनुमान लगाया जा सकता है। सरल शब्दों में, यदि आपके पास मॉडलों में केवल एक स्तर के सबफ़ोल्डर्स हैं और कोई नेमस्पेस मॉडल नहीं हैं, तो आपको केवल वही करना चाहिए config.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')]जो उप निर्देशिकाओं के पहले स्तर को जोड़ता है। समान libया अन्य रास्तों के लिए।
muichkine

3
@pdobb यह अनुभव है :) यदि आप देखते हैं कि ऑटो लोडिंग कैसे काम करता है तो आप देखेंगे कि यह उन सभी पर लूप करता auto_loading_pathsहै जिनमें यह मॉडल के लिए इंट्रेंस जोड़ता है। उदाहरण के लिए यदि आपके पास NameSpace::Modelयह सभी ऑटोलडिंग_पथों में खोजने की कोशिश करेगा a path/namespace/model। यह स्पष्ट रूप से केवल तभी मिल सकता pathहै जब निर्देशिका हो। अंगूठे के एक नियम के रूप में, आपके पास autoload_pathsअधिकतम दक्षता के लिए केवल निर्देशिका होनी चाहिए । आशा है कि इससे सहायता मिलेगी।
म्यूइकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.