require
(और इसके चचेरे भाई load
) कोर रूबी विधियां हैं। require_dependency
एक ऐसी विधि है जो रेलों को निर्भरता प्रबंधन की समस्या को संभालने में मदद करती है। लंबी कहानी छोटी है, यह रेल को विकास मोड में कक्षाओं को फिर से लोड करने की अनुमति देती है ताकि जब भी आप कोड बदलते हैं तो आपको सर्वर को पुनरारंभ करने की आवश्यकता नहीं होती है। रेल फ्रेमवर्क require_dependency
आपका कोड होगा ताकि परिवर्तन किए जाने पर इसे ट्रैक और पुनः लोड किया जा सके। मानक रूबी require
ऐसा नहीं करता है। एक ऐप (या प्लगइन/इंजन) डेवलपर के रूप में आपको require_dependency
के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि यह रेल के लिए पूरी तरह से आंतरिक है।
रेल वर्ग लोडिंग प्रक्रिया का जादू ActiveSupport :: निर्भरता मॉड्यूल में है। यह कोड रेल के पथ और फ़ाइल नामकरण सम्मेलनों का उपयोग करके स्वचालित रूप से मॉड्यूल (मॉड्यूल से प्राप्त कक्षाओं सहित) को लोड करने के लिए आपके रेल ऐप के अंदर कोड को अनुमति देने के लिए डिफ़ॉल्ट रूबी व्यवहार को बढ़ाता है। यह प्रोग्रामर की आवश्यकता को require
कॉल के साथ अपने कोड को कूड़े करने की आवश्यकता को समाप्त करता है जैसे कि आप एक सादे रुबी एप्लिकेशन में होंगे।
दूसरे शब्दों में कहें, यह आप फ़ाइल app/models/admin/user.rb
अंदर class Admin::User
को परिभाषित करने और रेल पता है तुम क्या बारे में जब आप एक नियंत्रक की तरह आवेदन के किसी अन्य भाग से Admin::User.new
फोन में बात कर रहे है की सुविधा देता है। ActiveSupport :: निर्भरता के बिना आपको मैन्युअल रूप से require
की आवश्यकता होती है जो आपको चाहिए।
यदि आप एक स्थिर रूप से टाइप की गई भाषा जैसे सी #, जावा, आदि से आ रहे हैं तो यह आश्चर्यचकित हो सकता है: रेल कोड को तब तक लोड नहीं किया जाता जब तक इसकी आवश्यकता न हो। उदाहरण के लिए, User
मॉडल क्लास परिभाषित नहीं किया गया है और user.rb
तब तक लोड नहीं होता है जब तक आप User.whatever_method_here
पर कॉल करने का प्रयास नहीं करते हैं। रेल रूबी को उस लापता निरंतर के बारे में शिकायत करने से रोकती है, User
के लिए कोड लोड करती है, और फिर रूबी को सामान्य के रूप में जारी रखने की अनुमति देती है।
जबकि मैं आपकी विशिष्ट आवश्यकता के लिए बात नहीं कर सकता, तो मुझे बहुत आश्चर्य होगा अगर आपको वास्तव में प्लगइन या इंजन के भीतर से require_dependency
विधि का उपयोग करने की आवश्यकता होती है। यदि आप रेल सम्मेलनों का पालन करते हैं तो आपको हाथ से $ LOAD_PATH को ट्विक नहीं करना चाहिए। यह "रेल मार्ग" नहीं है।
रुबी की दुनिया में और रेल सादगी और स्पष्टता महत्वपूर्ण है। यदि आप जो करना चाहते हैं वह एक प्लगइन या इंजन लिखना है और आप पहले से ही आंतरिक में गहरी डाइविंग कर रहे हैं तो आप एक अलग कोण से अपनी समस्या के करीब आने पर विचार कर सकते हैं। मेरा आंत मुझे बताता है कि आप ऐसा कुछ करने की कोशिश कर रहे हैं जो अनिवार्य रूप से जटिल है। लेकिन फिर, मुझे कोई संकेत नहीं है कि आप वास्तव में क्या कर रहे हैं !! :)
FYI करें: कक्षा पुन: लोड स्वचालित रूप से इंजन (जो लेकिन एप्लिकेशन/फ़ोल्डर के साथ प्लगइन्स कुछ भी नहीं कर रहे हैं) में नियंत्रित किया जाता है, जैसे वे सामान्य एप्लिकेशन में हैं। –
धन्यवाद, हाँ, मुझे इसके बारे में पता है। लेकिन फिर यह मेरे दूसरे प्रश्न की ओर जाता है: क्या मैं अपनी प्लगइन के अंदर अन्य प्लगइन का उपयोग कर सकता हूं? कहें, मैं अपनी खुद की प्लगइन में act_as_xxx प्लगइन का उपयोग करना चाहता हूं, क्या मैं सिर्फ अपने प्लगइन के विक्रेता/प्लगइन्स निर्देशिका के अंदर act_as_xxx डाल सकता हूं और फिर $ LOAD_PATH तक पथ जोड़ सकता हूं? मुझे लगता है कि मुझे इसे एक और थ्रेड में पूछना चाहिए, यह मेरे मूल प्रश्न से असंबंधित है। – wei