2009-10-07 9 views
11

मैं एक मॉड्यूल समेत एक कक्षा (जो एक प्लगइन में है) का विस्तार कर रहा हूं, यह प्रारंभकर्ता में किया जाता है।प्रारंभकर्ता से कक्षा का विस्तार कैसे करें और इसे विकास पर्यावरण में पुनः लोड करें?

require 'qwerty/core/user' 
User.send :include, Qwerty::Core::Extensions::User 

हालांकि हर अनुरोध से पहले विकास में (और पुनः लोड के बाद! कंसोल में कहा जाता है) सभी मॉडलों पुनः लोड कर रहे हैं, बल्कि इसलिए initializers फिर से चलाने के नहीं कर रहे हैं मॉड्यूल शामिल नहीं है। 'गायब हिस्सों' के साथ एक मॉडल छोड़ना।

क्योंकि मॉडल प्लगइन में है, इसलिए कक्षा में सीधे कोड शामिल करना बुद्धिमान नहीं लगता है जो सामान्य दृष्टिकोण होगा।

अभी के लिए मैंने बस पहले_फिल्टर जोड़ा है जिसमें विकास वातावरण में मॉड्यूल शामिल है। लेकिन मेरे पास कॉपी/पेस्ट है और शुरुआती और एप्लिकेशन नियंत्रक में डुप्लिकेट कोड है।

# Class extensions in initalizers are over-writtern each request 
    def development_loading 
    if RAILS_ENV == 'development'  
     User.send :include, Qwerty::Core::Extensions::User 
    end 
    end 

क्या कोई बेहतर तरीका है?

एक पक्ष टिप्पणी प्लगइन मेरा है के रूप में, तो मैं क्यों आप initializers का उपयोग कार्यक्षमता शामिल करने के लिए कि यह करने के लिए कोड जोड़ सकते हैं, लेकिन एक्सटेंशन मॉड्यूल में आयोजित हमेशा मौजूद नहीं हो सकता है ...

उत्तर

11

environment.rb

config.to_prepare do 
    User.send :include, Qwerty::Core::Extensions::User 
end 

कोड ब्लॉक को विकास मोड में प्रत्येक अनुरोध से पहले और उत्पादन मोड में एक बार चलाने से पहले चलाया जाता है।

+1

यह मेरे लिए काम करता था, लेकिन application.rb (रेल 3.0.20) में, पर्यावरण नहीं। आरबी – tekniklr

+0

यह रेल इंजन में इंजन.आरबी में जोड़ने के लिए रेल 4 में पूरी तरह से काम करता है। धन्यवाद! –

0

?

require 'qwerty/core/user' 
class User < ActiveRecord::Base 
    include Qwerty::Core::Extensions::User 
    # bla bla 
end 
+0

क्योंकि वह केवल उस कोड को विकास मोड में शामिल करना चाहता है। – SFEley

+0

क्योंकि मॉडल प्लगइन में है, जबकि यह एक प्लगइन है, जबकि मैं विकास कर रहा हूं, मैं इसे किसी तृतीय पक्ष प्लगइन की तरह व्यवहार कर रहा हूं, इसलिए मैं इसमें कोड को स्पर्श नहीं करना चाहता हूं। इसलिए मुझे उन वर्गों को बाहर से विस्तारित करना होगा। – Kris

1

पहले तो मुझे विकास मोड में अपनी लोड पथ के सामने करने के लिए एक 'विकास' निर्देशिका जोड़ने के बारे में कुछ सलाह देने के लिए, ताकि आपके संशोधन हमेशा पुनः लोड जायेगा जा रहा था:

बजाय निम्नलिखित का प्रयास करें पहले ... लेकिन फिर यह मेरे लिए हुआ कि आपने कुछ भ्रमित कहा था।

वह मॉडल जिसे आप विस्तारित करने का प्रयास कर रहे हैं। यह प्लगइन में है? प्लगइन्स को विकास मोड में डिफ़ॉल्ट रूप से पुनः लोड करने के लिए नहीं हैं, जब तक कि ऐप स्पष्ट रूप से कहता है कि उन्हें Config.reload_plugins? को गलत पर सेट करके इसकी कॉन्फ़िगरेशन में होना चाहिए।

लेकिन अगर किसी कारण से, अपने प्लगइन वैसे भी पुन: लोड है और आप नहीं इसे करने के लिए, आपको अपने प्लगइन के init.rb स्पष्ट रूप से कहने के लिए यह फिर से लोड नहीं करना चाहिए इस डाल सकते हैं चाहते हो :

Dependencies.load_once_paths << lib_path 

और अधिक विस्तार के लिए विन्यास वर्ग ऑन रेल्स डॉक्स देखें: http://api.rubyonrails.org/classes/Rails/Configuration.html#M002536

+0

हां, मेरे पास reload_plugins है? सत्य पर सेट करें क्योंकि मैं सक्रिय रूप से प्लगइन विकसित कर रहा हूं। मैं रेल ऐप से प्लगइन में मॉडलों को विस्तारित करने का एक तरीका बनाना चाहता हूं (यानी प्लगइन कोड को छूए बिना)। थोड़ा उलझन में हाँ! मेरे init.rb में मेरे पास है: यदि RAILS_ENV == 'विकास' ActiveSupport :: Dependencies.load_once_paths.reject! {| X | x = ~ /^#{Regexp.escape(File.dirname(__FILE__))}/} अंत – Kris

+0

मुझे लगता है कि मेरी समस्या यह है क्योंकि मैं एक बार में दो चीजें करने की कोशिश कर रहा हूं - एक प्लगइन पर काम करें (इसे प्रत्येक अनुरोध को पुनः लोड करें) और रेल ऐप से प्लगइन का विस्तार करें। थोड़ा पकड़ 22 ... – Kris

+0

क्यों? खुद को इन सभी बाधाओं को क्यों दें? आप प्लगइन में विकास कोड नहीं जोड़ना चाहते हैं, आप इसे केवल एक बार लोड नहीं करना चाहते हैं, और आप अपने ऐप से अपनी प्लगइन को विस्तारित करके प्लगइन के _idea_ को पीछे हटाना चाहते हैं (जो दार्शनिक रूप से पीछे की ओर है)। इन सभी विशेष मामलों से आपको क्या लाभ होता है? क्या आपकी प्लगइन में कुछ तोड़ने के लिए कुछ 'अगर RAILS_ENV ==' विकास 'स्थितियां जोड़ रही हैं? आप इसे बाद में फिर से बाहर ले जा सकते हैं, या एक्सटेंशन को उन फ़ाइलों में डाल सकते हैं जो केवल एक विशेष गिट शाखा में रहते हैं। नदी से लड़ने से बाहर निकलें। प्रवाह के साथ जाओ। रेल को रेल होने दें। यह पूर्ण करो। – SFEley

3

स्वीकार किए जाते हैं क्योंकि यह एक प्रारंभकर्ता में रखा जा सकता एक से थोड़ा अधिक सुरुचिपूर्ण समाधान:

require 'dispatcher' 

Dispatcher.to_prepare do 
    # stuff that needs to happen once per initialization 
end 
6

रेल 3.x में आप (हर बार पुनः लोड होने को चलाने के लिए विकास मोड में एक ब्लॉक कॉन्फ़िगर कर सकते हैं, या जब config.cache_classes = false)।यह एक प्रारंभकर्ता में जाएगा:

ActionDispatch::Callbacks.to_prepare do 
    # configure stuff or initialize 
end 
संबंधित मुद्दे