2012-05-05 12 views
6
> rvm list 
rvm rubies 

=* ruby-1.9.2-p290 [ i686 ] 
    ruby-1.9.3-p194 [ i686 ] 

> rails -v 
Rails 3.1.1 

संबंधित है, लेकिन जवाब नहीं दिया: Is there a Rails Console command (Rails 3+) to reload changed code?मैं रेल कंसोल में मॉडल कैसे पुनः लोड करूं?

मैं रेल सांत्वना कोशिश करते हैं और यह पता लगाने क्यों अपने मॉडल में एक विधि कहा जाता है नहीं हो पाने का उपयोग कर रहा हूँ। मॉडल ./app/models/product.rb में है। मैं self.trim_history से trim_history के रूप में बुलाया जाने वाला एक तरीका बदल रहा हूं। मैं अभी भी self.do_stuff या बस do_stuff के रूप में एक विधि को कॉल करने के लिए अपने सिर को लपेट रहा हूं।

अच्छी तरह से इसे समझने के दौरान मैंने reload! के साथ एक समस्या में भाग लिया है। मेरी समझ यह थी कि reload! फिर से सभी मॉडलों और नियंत्रकों को लोड करेगा, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। जब मैं अपना कोड डीबग करता हूं, तो जिस लाइन को मैंने बदल दिया है do_stuff अभी भी डीबगर में self.do_stuff के रूप में दिखा रहा है।

मैंने reload! के साथ इसे हल करने का प्रयास किया है, कोई फिक्स नहीं। मैंने पुनः लोड करने के बाद डेटाबेस से ऑब्जेक्ट को फिर से लोड किया है, कोई फिक्स नहीं। मैंने सीधे मॉडल को load './app/models/product.rb' से लोड किया है, फिर ऑब्जेक्ट को डीबी से लोड किया है, कोई फिक्स नहीं है। मैंने सत्यापित किया है कि ऑब्जेक्ट tail के साथ बदला जा रहा है।

रेल कंसोल में मॉडल को फिर से लोड करने का सबसे अच्छा तरीका क्या है? क्या मेरे मॉडल कोड में हर बार कंसोल को फिर से शुरू करना होगा? कंसोल को फिर से लोड किए बिना सभी मौजूदा मॉडल और उनके कोड को डंप करने का कोई तरीका है?

संपादित करें: यह अजनबी हो गया। अब मुझे संदेह है कि मेरा कोड पुनः लोड किया जा रहा है लेकिन डीबगर नए कोड को प्रतिबिंबित नहीं कर रहा है। जब मैं कोड के माध्यम से कदम उठाता हूं, तो पुराना कोड होता है, लेकिन नया कोड निष्पादित किया जा रहा है। मैंने raise जोड़कर इसका परीक्षण किया - raise डीबगर में कभी नहीं दिखाता है लेकिन यह उठाया जाता है। वाट?

क्या मुझे पुनः लोड किए गए कोड को देखने के लिए डीबगर के साथ कुछ करने की ज़रूरत है? यह एक बग की तरह दिखता है ...

+1

क्या आप कक्षा में या कक्षा के उदाहरण पर विधि को कॉल करने का प्रयास कर रहे हैं? –

+0

@ChrisSchmitz कक्षा का उदाहरण; मैं स्वयं को तब तक कोड के साथ गड़बड़ कर रहा हूं जब तक मैं इसे समझ नहीं पा रहा हूं। – jcollum

+0

रूबी के लिए कई अलग-अलग डिबगर्स हैं, यह निर्दिष्ट करने में सहायक होगा कि आप किस का उपयोग कर रहे हैं। –

उत्तर

16

reload! मौजूदा ऑब्जेक्ट्स को पुन: प्रारंभ नहीं करता है, यह केवल कोड को पुनः लोड करता है। यदि आप कक्षा का एक नया उदाहरण बनाते हैं तो इसे परिवर्तनों को प्रतिबिंबित करना चाहिए।

+0

यह कवर किया गया है ओपी, शायद मैं जिस तरह से सोच रहा हूं उस वस्तु को नहीं बना रहा हूं? मैं इसे डीबी से लोड करके बना रहा हूं: 'p = product.by_name 'Acme Mop'' - यह' Product.where (name: name)। First' को कॉल कर रहा है - क्या यह समस्या हो सकती है? – jcollum

+0

@jcollum वह यह नहीं कह रहा है कि * कैसे * वे बनाए गए हैं प्रासंगिक है, बल्कि * कब *। क्या आप 'रीलोड' कॉल करने से पहले या बाद में ऑब्जेक्ट बना रहे हैं? –

+0

@ एंड्रयू मार्शल फिर से, ओपी में शामिल है। मैं 'रीलोड' कॉल करने के बाद ऑब्जेक्ट को डीबी से लोड कर रहा हूं और कोड में परिवर्तन – jcollum

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