2009-09-21 14 views
54

require और require_dependency कैसे हैं?
require_dependency स्वचालित रूप से विकास में कक्षाओं को फिर से लोड कर सकता है लेकिन require नहीं कर सकता है?रेल में संबंधित आवश्यकता, आवश्यकता-निर्भरता और स्थिरांक रीलोडिंग की आवश्यकता कैसे है?

मैंने रेल के ActiveSupport::Dependencies और dispatcher.rb कोड में खोला। मैंने require_dependency के कोड में जो देखा वह मूल रूप से स्थिरांक को autoloaded_constants सरणी में जोड़ता है। लेकिन प्रत्येक अनुरोध के बाद प्रेषक के अंदर clear_application में इसे साफ़ कर दिया जाता है।

क्या कोई स्पष्ट स्पष्टीकरण दे सकता है या मुझे कुछ संसाधनों को इंगित कर सकता है जो मदद करेगा?

+0

FYI करें: कक्षा पुन: लोड स्वचालित रूप से इंजन (जो लेकिन एप्लिकेशन/फ़ोल्डर के साथ प्लगइन्स कुछ भी नहीं कर रहे हैं) में नियंत्रित किया जाता है, जैसे वे सामान्य एप्लिकेशन में हैं। –

+0

धन्यवाद, हाँ, मुझे इसके बारे में पता है। लेकिन फिर यह मेरे दूसरे प्रश्न की ओर जाता है: क्या मैं अपनी प्लगइन के अंदर अन्य प्लगइन का उपयोग कर सकता हूं? कहें, मैं अपनी खुद की प्लगइन में act_as_xxx प्लगइन का उपयोग करना चाहता हूं, क्या मैं सिर्फ अपने प्लगइन के विक्रेता/प्लगइन्स निर्देशिका के अंदर act_as_xxx डाल सकता हूं और फिर $ LOAD_PATH तक पथ जोड़ सकता हूं? मुझे लगता है कि मुझे इसे एक और थ्रेड में पूछना चाहिए, यह मेरे मूल प्रश्न से असंबंधित है। – wei

उत्तर

108

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 को ट्विक नहीं करना चाहिए। यह "रेल मार्ग" नहीं है।

रुबी की दुनिया में और रेल सादगी और स्पष्टता महत्वपूर्ण है। यदि आप जो करना चाहते हैं वह एक प्लगइन या इंजन लिखना है और आप पहले से ही आंतरिक में गहरी डाइविंग कर रहे हैं तो आप एक अलग कोण से अपनी समस्या के करीब आने पर विचार कर सकते हैं। मेरा आंत मुझे बताता है कि आप ऐसा कुछ करने की कोशिश कर रहे हैं जो अनिवार्य रूप से जटिल है। लेकिन फिर, मुझे कोई संकेत नहीं है कि आप वास्तव में क्या कर रहे हैं !! :)

16

require_dependency एक इंजन में उपयोगी होता है जब आप अपने इंजन में परिभाषित नहीं किया जाता है (उदाहरण के लिए किसी अन्य इंजन या रेल ऐप में) और इसे फिर से लोड किया जाता है।जिसमें इस तरह के मामले में कुछ काम करता है:

# app/controllers/my_engine/documents_controller.rb 
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s 

module MyEngine 
    class DocumentsController 
    def show 
     render :text => 'different' 
    end 
    end 
end 
संबंधित मुद्दे