2012-03-21 20 views
15

में नामित कक्षाओं के साथ ए :: बी द्वारा संदर्भित निरंतर बी को निरंतर बी को निरस्त करना, एक कस्टम निर्देशिका में फ़ाइलों को संग्रहीत करते समय (उदाहरण: app/presenters/), आप कैसे सुनिश्चित करते हैं कि नामांकित कक्षाएं लोड की गई हैं?"चेतावनी: रेलवे

उदाहरण के लिए

, यदि आपके पास:

CatalogPresenter.new 
=> #<CatalogPresenter:0x85bca68 @_routes=nil> 

MegaMenu::CatalogPresenter.new 
(irb):3: warning: toplevel constant CatalogPresenter referenced by MegaMenu::CatalogPresenter 
=> #<CatalogPresenter:0x85750a0 @_routes=nil> 
:

रेल विफल रहता है MegaMenu::CatalogPresenter लोड करने के लिए 10

मैंने एक sample Rails 3.2 app that reproduces this problem बनाया है।

config/application.rb में, app's configured to load files in app/presenters/

उत्तर

17

मैं एक प्रारंभकर्ता में एक बयान की आवश्यकता का उपयोग करके इस समस्या को हल किया। मुझे यह बहुत पसंद नहीं है लेकिन मुझे अपने आवेदन की संरचना और कक्षा के नाम पसंद आया, उन्होंने समझ में आया कि एक प्रारंभिक मेरा सबसे अच्छा समाधान था। प्रारंभकर्ता कोशिश में:

require File.join(Rails.root, "app", "presenters", "mega_menu", "catalog_presenter") 
require File.join(Rails.root, "app", "presenters", "catalog_presenter") 

यह समस्या होती है क्योंकि autoload बुलाया जा रहा है जो अपने मामले में नहीं होगी const_missing पर निर्भर करता है।

जब गहरे लाल रंग का पहला MegaMenu :: CatalogPresenter के लिए एक संदर्भ सामना करता है, mega_menu/catalog_presenter.rb फ़ाइल शामिल नहीं किया गया है। मानक रूबी व्यवहार का कारण यह नामस्थान पेड़ (भाषण की आकृति) तक चलता है और इसके बजाय यह शीर्ष स्तर संदर्भ कैटलॉग प्रस्तुतकर्ता पाता है क्योंकि इसे इस बिंदु पर शामिल किया गया है।

+0

क्या यह ऐप/मॉडल निर्देशिका के समान तरीके से लागू होता है? मेरे पास एक ऐप/मॉडल/लोग/data.rb है और मुझे एक ही अपवाद मिलता है क्योंकि डेटा पहले ही परिभाषित है। – joshhepworth

+2

यह कहीं भी लागू होगा। यह सिर्फ एक मामला है कि कैसे लापता स्थिरांक हल हो जाते हैं। यदि आप सुनिश्चित करते हैं कि आपको स्पष्ट रूप से दोनों मॉडलों की आवश्यकता है, तो आपको इस समस्या में भाग नहीं लेना चाहिए। –

0

कक्षाओं के अंदर नए अपरिवर्तनीय स्थिरांक बनाना इस त्रुटि को उठाता है। आप catalog_presenter.rb में इस तरह के और अधिक कुछ चाहते हैं:

class MegaMenu 
    class MegaMenu::CatalogPresenter 
    end 
end 
+0

सुझाव, Veraticus के लिए धन्यवाद। दुर्भाग्यवश, उस परिवर्तन के बाद, समस्या अभी भी मौजूद है। ऐसा लगता है जैसे रेल को पता नहीं है कि इसे 'ऐप/प्रस्तुतकर्ता/mega_menu/catalog_presenter.rb' देखना चाहिए। – nickh

+0

ओह ठीक है, यह एक शॉट के लायक था। :/एकमात्र अन्य सुझाव जो मैं करता हूं वह आपके ऑटोलोड लोड पथ में मैन्युअल रूप से '' 'ऐप/प्रस्तुतकर्ता/mega_menu''' जोड़ना है और देखें कि क्या यह ठीक है या नहीं। – Veraticus