2014-07-03 6 views
14

यह समझाने के लिए एक मुश्किल है। तो फिरउस फ़ाइल में परिभाषित होने के बावजूद रेल फ़ाइल से निरंतर स्वत: लोड करने में असमर्थ

# app/models/points/calculator.rb 
module Points 
    module Calculator 
    def self.included(base) 
     base.send(:include, CommonMethods) 
     base.send(:include, "Points::Calculator::#{base}Methods".constantize) 
    end 
    end 
end 

अन्य वर्गों में सब मैं क्या करने की जरूरत है: मैं बहुत की तरह एक और मॉड्यूल नाम स्थान में एक मॉड्यूल है

class User 
    include Points::Calculator 
end 

मैं application.rb में इस निर्देशिका में निर्दिष्ट किया है autoloadable होने के लिए ... (भले ही मुझे लगता है कि रेल मॉडल के माध्यम से रिकर्स ...)

config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ] 

विकास एनवी में, सब कुछ ठीक काम करता है। जब परीक्षण (और उत्पादन env) चल रहा है, मैं निम्नलिखित त्रुटि मिलती है:

Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError) 

मैं वास्तव में यहाँ सलाह का पालन समस्या को ठीक करने: स्पष्ट रूप से application.rb में calculator.rb की आवश्यकता द्वारा Stop Rails from unloading a module in development mode

हालांकि, यह क्यों हो रहा है ??

मैंने ActiveSupport की निर्भरताओं.आरबी फ़ाइल में कुछ डीबग आउटपुट फंस लिया और देखा कि इस फ़ाइल को दो बार जरूरी है। पहली बार इसकी आवश्यकता है कि मैं देख सकता हूं कि स्थिर वास्तव में लोड किया गया है।

लेकिन दूसरी बार इसकी आवश्यकता होती है जब तक रेल बता सकते हैं, लेकिन जब वास्तविक आवश्यकता को बुलाया जाता है, तो रूबी झूठी वापसी करता है क्योंकि रूबी जानता है कि इसकी पहले से ही आवश्यकता है। फिर रेल "निरंतर स्वत: लोड करने में असमर्थ" त्रुटि फेंकता है क्योंकि स्थिर अभी भी मौजूद नहीं है और रूबी को फ़ाइल की "पुनः आवश्यकता" नहीं है।

क्या कोई इस पर प्रकाश डाल सकता है कि यह क्यों हो रहा है?

+0

ऑटोलोड करने योग्य पथों के खोने से अंक हटाने में मदद मिलती है? यह आवश्यक नहीं होना चाहिए –

+0

हां, मैंने इसे ऑटोलोड लोड पथ के साथ और बिना कोशिश की है। एक ही समस्या है। –

+0

एक ही समस्या होने के लिए लगता है। कक्षा की आवश्यकता होने के लिए बहुत परेशान होना, क्योंकि मेरे पास लगभग 30+ ऐसे वर्ग हैं। – Kohanz

उत्तर

0

Calculator एक वर्ग autoloaded जा करने के लिए सही ढंग से

module Points 
    class Calculator 
    ... 
    end 
end 
+0

क्षमा करें, मैंने इसे गलत बताया है, यह मॉड्यूल में एक मॉड्यूल है ... मैंने उपर्युक्त विवरण को और सटीक होने के लिए अपडेट किया है ... क्या यह तथ्य है कि इसका मॉड्यूल ऑटोलोडिंग को प्रभावित करता है? –

+0

उस स्थिति में मैं 'ऐप/मॉडल' – infused

+1

lib के बजाय' lib' निर्देशिका में फ़ाइल को रखने की अनुशंसा करता हूं, lib गैर-अनुप्रयोग विशिष्ट पुस्तकालयों के लिए है, इसलिए मैं इस ऐप/को डाल रहा हूं। हालांकि, मैं इसे ऐप/lib या शायद ऐप/चिंताओं या ऐप/मॉडल/चिंताओं निर्देशिका में डालने के लिए एक तर्क देख सकता हूं –

7

रेल बढाती है माणिक की लगातार देखने तंत्र होना चाहिए।

रूबी में लगातार देखने: method missing को

इसी प्रकार, एक Module#constant-missing लागू जब एक निरंतर के लिए एक संदर्भ हल किया जा करने में विफल रहता है। जब हम किसी दिए गए शाब्दिक दायरे में एक निरंतर का उल्लेख है कि निरंतर में के लिए खोज की है:

Each entry in Module.nesting 
Each entry in Module.nesting.first.ancestors 
Each entry in Object.ancestors if Module.nesting.first is nil or a module. 

जब हम एक निरंतर का उल्लेख, रूबी पहले के अनुसार यह पता लगाने के लिए प्रयास करता है इस में निर्मित देखने नियम।

गहरे लाल रंग का पता लगाने के लिए विफल रहता है ... बज उठती रेल, और its own lookup convention और अपने ज्ञान के बारे में जो स्थिरांक पहले से ही (रूबी) के द्वारा लोड किया गया है का उपयोग करते हुए, रेल ओवरराइड करता है Module#const_missing स्पष्ट की आवश्यकता के बिना गायब स्थिरांक लोड करने के लिए प्रोग्रामर द्वारा कॉल की आवश्यकता है।

इसका अपना लुकअप सम्मेलन?

रूबी के ऑटोलोड (जिसके लिए प्रत्येक ऑटोलोडेड स्थिरांक के स्थान को पहले से निर्दिष्ट किया जाना चाहिए) के विपरीत रेलवे नामों को कॉन्स्टेंट करने वाले एक सम्मेलन के बाद रेल।

Points::Calculator # =>points/calculator.rb 

अब लगातार अंक :: कैलक्यूलेटर के लिए, खोज इस फ़ाइल पथ (यानी 'अंक/calculator.rb') autoload रास्तों के भीतर, autoload_paths विन्यास द्वारा परिभाषित रेल।

इस मामले में, रेल ने अपने स्वत: लोड किए गए पथों में फ़ाइल पथ points/calculator की खोज की, लेकिन फ़ाइल खोजने में विफल रहता है और इसलिए यह त्रुटि/चेतावनी दिखाई देती है।

यह उत्तर इस Urbanautomation blog से एक सार है।

+5

वास्तव में, मैंने यह पोस्ट देखा है और आपकी व्याख्या के लिए धन्यवाद। लेकिन, फ़ाइल मौजूद है और एक बार सही ढंग से लोड हो चुकी है, लेकिन जैसा ऊपर बताया गया है, मैं इसे दो बार जरूरी देख सकता हूं और दूसरी बार चारों ओर घूमता हूं, निरंतर निरंतर लोड किया गया है। मैं अस्पष्ट हूं कि आपका स्पष्टीकरण उस तथ्य को कैसे संबोधित करता है। –

+3

क्या आपने इसे हल किया? – Joe

संबंधित मुद्दे