2012-06-15 12 views
5

मुझे रेलवे 2.4/रूबी 1.8.7 से रेल 3.1/रूबी 1.9.2 तक अपग्रेड करने के लिए एक विरासत कोडेबेस पर लाया गया था। ऐसा करने के दौरान, मुझे एक बहुत ही रोचक समस्या मिली जिसमें पता लगाने की कोशिश करने में 3 दिन लग गए। मैं इसे यहां किसी और के लिए कुछ Google रस देने के लिए इसे छोड़ना चाहता था, और सवाल पूछने के लिए: क्यों?रूबी 1.9.2 में रैक स्तर पर SystemStackError, 1.8.7

असल में, मैं अपने ऐप को चलाने पर रैक स्तर पर SystemStackError देख रहा था। त्रुटि उत्पन्न होने से पहले मुझे कोई अनुरोध नहीं मिला, और इसे डीबग नहीं किया जा सका क्योंकि मेरा कोड कभी छुआ नहीं था। विकास मोड में, मैं साइट पर अधिकतर देखने में सक्षम हूं, फिर डेटाबेस को मारा जाने पर अचानक SystemStackError प्राप्त होगा। तो मैंने सोचा कि यह कुछ आलसी लोडिंग था।

उत्पादन मोड पर स्विच करें, और अपवाद पहले अनुरोध पर होता है। सर्वर सामान्य रूप से शुरू होता है, लेकिन कोई अनुरोध इसे माध्यम से नहीं बनाता है, और मेरा कोड स्पर्श नहीं हुआ था।

/Users/john/.rvm/gems/[email protected]ruby19/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:102:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:140:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/rendering.rb:74:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/abstract_controller/layouts.rb:301:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/url_for.rb:103:in `initialize' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `new' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_controller/metal.rb:238:in `block in action' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:71:in `dispatch' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:35:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:152:in `block in call' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:96:in `block in recognize' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:68:in `optimized_each' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/code_generation.rb:95:in `recognize' 
/Users/john/.rvm/gems/[email protected]/gems/rack-mount-0.8.3/lib/rack/mount/route_set.rb:141:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/actionpack-3.1.6/lib/action_dispatch/routing/route_set.rb:538:in `call' 
/Users/john/.rvm/gems/[email protected]/gems/omniauth-1.1.0/lib/omniauth/builder.rb:48:in `call' 
... 

क्या हम यहाँ देख प्रणाली rendering.rb को layouts.rb को metal.rb से साइकिल चालन के लिए url_for.rb के लिए है:

फास्ट आगे भी कई घंटे, और मैं नीचे ट्रैस बैक रेल में एक पाश (full gist) के लिए उत्तरदायी url_for.rb को metal.rb, आदि

काफी प्रयास के बाद, मैं इस नीचे निम्न पंक्ति को (like so) एक मॉडल फ़ाइल के शीर्ष पर नज़र रखी:

012,351,
include ActionView::Helpers::UrlHelpers 

नोट, यह कक्षा के अंदर नहीं है, यह मॉड्यूल स्तर पर है।

दिलचस्प बात यह है कि यह रूबी 1.8.7 में काम करता है लेकिन रूबी 1.9.2 में SystemStackError का कारण बनता है।

मैंने Github repository illustrating this behavior बनाया है।

यदि आप इस भंडार को पकड़ते हैं, और ruby18 शाखा चलाते हैं, तो आप एक पृष्ठ लोड कर सकते हैं। यदि आप ruby19 शाखा चलाते हैं, तो आपको किसी भी अनुरोध पर सिस्टमस्टैक त्रुटि मिलती है (कोई भी अनुरोध जहां विजेट लोड होता है, इसे उत्पादन में चलाएं और यह आलसी लोड नहीं होगा)।

तो, क्या किसी को पता है क्यों?

मेरा मतलब है, मुझे लगता है कि रूबी 1.9 लोड मॉड्यूल के तरीके से कुछ करना है, क्योंकि यह एक समस्या नहीं प्रतीत होता है क्योंकि रेल कोर द्वारा का कारण बनता है। मेरी मुख्य चिंता यह है कि यह कोडबेज में आलसी प्रोग्रामिंग प्रथाओं के कारण सिर्फ एक गूढ़ मुद्दा है, या यदि यह रूबी या रेल में गहरी समस्या के लिए सूचक है।

+0

मेरे पास एक ही समस्या है। अगर मैं पूरे टेस्ट सूट को लॉन्च करता हूं तो थोड़ा और संदर्भ जोड़ने के लिए मैं इस त्रुटि को दबाता हूं लेकिन अगर मैं एक एकल टेस्ट लॉन्च करता हूं तो यह आसानी से काम करता है। संकल्प पर कोई खबर? thx – gicappa

+1

मेरे लिए संकल्प '' 'एक्शन व्यू :: हेल्पर्स :: UrlHelpers'' को हटाने के लिए था जो लूप का कारण बन रहा था। यदि आपके पास यह नहीं है, तो मेरा संदेह - आपके कोड के बारे में कुछ भी जानने के बिना- यह है कि एक और चीज समान है। – JohnMetta

+0

धन्यवाद मुझे पता चला कि मैंने एक परीक्षण में एक्शन व्यू :: हेल्पर्स :: टैगहेल्पर शामिल किया था। – gicappa

उत्तर

1

यह Bug 3144 जैसा दिखता है, जो सीधे सहायक का संदर्भ देता है।

Rails.application.routes.url_helpers 
+0

मैंने इसकी खोज की, लेकिन इसे नहीं मिला। यहां लिंक करने के लिए धन्यवाद। – JohnMetta

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