मुझे लगता है कि इस आशय रास्ता ActionController::Reloader
लिखा है से आता है। यहाँ ActionController::Reloader#call
2.3.3 से है, टिप्पणी पर ध्यान दें:
def call(env)
Dispatcher.reload_application
status, headers, body = @app.call(env)
# We do not want to call 'cleanup_application' in an ensure block
# because the returned Rack response body may lazily generate its data. This
# is for example the case if one calls
#
# render :text => lambda { ... code here which refers to application models ... }
#
# in an ActionController.
#
# Instead, we will want to cleanup the application code after the request is
# completely finished. So we wrap the body in a BodyWrapper class so that
# when the Rack handler calls #close during the end of the request, we get to
# run our cleanup code.
[status, headers, BodyWrapper.new(body)]
end
Dispatcher.reload_application
ऑटो लोड स्थिरांक को दूर नहीं करता, Dispatcher.cleanup_application
करता है। BodyWrapper#close
मन में संभव अपवादों के साथ लिखा है:
def close
@body.close if @body.respond_to?(:close)
ensure
Dispatcher.cleanup_application
end
हालांकि इस मदद नहीं करता है, क्योंकि अगर ActionController::Reloader#call
में @app.call
एक अपवाद फेंकता है, BodyWrapper
instantiated नहीं होता है, और Dispatcher.cleanup_application
बुलाया प्राप्त करता है।
इस परिदृश्य की कल्पना कीजिए:
- मैं अपने फ़ाइलों में से एक है जो API कॉल
- मैं API कॉल एक बग के साथ एक सहित सभी फाइलों को मारा और त्रुटि देखते हैं इस बिंदु पर, को प्रभावित करता है में परिवर्तन करने के नहीं हैं 'टी उतार
- मैं एक codefix बनाने के लिए और जांच करने के लिए एक ही API कॉल मारा अगर यह काम किया
- कॉल उसी तरह से कराई हो जाता है के रूप में पहले वर्ष की कक्षाओं/वस्तुओं/मॉड्यूल के लिए। यह एक ही त्रुटि फेंकता है और फिर स्मृति
यह नहीं होता है जब पारंपरिक नियंत्रकों त्रुटियों बढ़ा क्योंकि उन ActionController::Rescue
द्वारा नियंत्रित किया जाता है में भरी हुई स्थिरांक छोड़ देता है। ऐसे अपवाद ActionController::Reloader
पर नहीं आते हैं।
आसान समाधान, इस के कुछ बदलाव एपीआई मार्ग मिडलवेयर में वापस आने बचाव खंड डाल करने के लिए होगा:
def call(env)
# route API call
resuce Exception
Dispatcher.cleanup_application
raise
end
ध्यान दें कि यह 3 वर्ष पुराने सवाल का मेरा उत्तर है और मैं 2.3.3 के कॉल स्टैक पीछा । रेल के नए संस्करण चीजों को अलग-अलग संभाल सकते हैं।
स्रोत
2012-08-22 13:52:16
मुझे यह समस्या भी है। –