नोट यह मूल रूप से 404 त्रुटियों के बारे में एक प्रश्न के रूप में शुरू हुआ, लेकिन अब यह एक सवाल है कि मैंने जिस पैच को लागू किया है, वह एक फर्क पड़ेगा।[एक्स, वाई, जेड] के बीच क्या अंतर है। प्रत्येक {| एम | एम} शामिल करें और एक्स, वाई, जेड शामिल हैं?
ActiveRecord :: RecordNotFound अपवाद को बढ़ाने वाले सभी अनुरोधों पर 404 को वापस करने के लिए कैश किए गए कार्य को आप कैसे प्राप्त करते हैं, केवल पहले अनुरोध नहीं?
उदाहरण के लिए, यदि आप एक खाली रेल परियोजना शुरू करते हैं, तो एक उत्पाद मॉडल और नियंत्रक जोड़ें, अपना डेटाबेस.आईएमएल सेट करें, उत्पादन में अपने कैश बैकएंड को सेट करें। आरबी, रेक डीबी: माइग्रेट करें, फिर उत्पादन में शुरू करें और साइट पर हिट करें एक अस्तित्वहीन वस्तु के लिए, उदाहरण के लिए http://localhost:3000/product/show/1234
class ProductController < ApplicationController
caches_action :show
def show
@product = Product.find(params[:id])
render :text => "asdf"
end
end
पहली बार पेज मारा जाता है, यह उम्मीद के रूप में 404 पेज देता है। हालांकि, उस यूआरएल पर आने वाली प्रत्येक हिट 200 ओके के साथ एक खाली पृष्ठ देता है। आप इसे हर बार 404 वापस करने के लिए कैसे प्राप्त करते हैं?
यहाँ कर्ल अनुरोध, लॉग
~ $ curl -I http://0.0.0.0:3000/product/show/1234
HTTP/1.1 404 Not Found
Connection: close
Date: Mon, 20 Apr 2009 22:49:18 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Content-Length: 14097
~ $ curl -I http://0.0.0.0:3000/product/show/1234
HTTP/1.1 200 OK
Connection: close
Date: Mon, 20 Apr 2009 22:49:19 GMT
X-Runtime: 6
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Content-Length: 0
दूसरी प्रतिक्रिया स्पष्ट रूप से गलत है, जिसके बाद कर रहे हैं।
Processing ProductController#show (for 127.0.0.1 at 2009-04-20 17:35:24) [GET]
Parameters: {"id"=>"1234"}
ActiveRecord::RecordNotFound (Couldn't find Product with ID=1234):
app/controllers/product_controller.rb:6:in `show'
Rendering rescues/layout (not_found)
Processing ProductController#show (for 127.0.0.1 at 2009-04-20 17:35:30) [GET]
Parameters: {"id"=>"1234"}
Filter chain halted as [#<ActionController::Caching::Actions::ActionCacheFilter:0x23e36d4 @options={:cache_path=>nil, :store_options=>{}, :layout=>nil}>] rendered_or_redirected.
Filter chain halted as [#<ActionController::Filters::AroundFilter:0x23e3580 @kind=:filter, @options={:unless=>nil, :if=>nil, :only=>#<Set: {"show"}>}, @method=#<ActionController::Caching::Actions::ActionCacheFilter:0x23e36d4 @options={:cache_path=>nil, :store_options=>{}, :layout=>nil}>, @identifier=nil>] did_not_yield.
Completed in 12ms (View: 0, DB: 0) | 200 OK [http://0.0.0.0/product/show/1234]
वास्तव में, अगर आप कैश से बाहर कैश की गई कार्रवाई खींच, यह वहाँ में खाली कचरा के कुछ प्रकार है:
यहाँ 2 अनुरोधों के लिए लॉग की एक प्रति है।
cache.fetch("views/0.0.0.0:3000/product/show/1234")
=> ["", nil, [], []]
मैं यहां क्या गलत कर रहा हूं?
संपादित
मैंने पुष्टि की है कि रेल 2.1.2 और 2.2.2 इस व्यवहार प्रदर्शित नहीं है, लेकिन 2.3.2 करता है। (यानी पुराने संस्करण कैश में खाली प्रतिक्रिया संग्रहीत नहीं करते हैं और वे वास्तव में बाद के अनुरोधों के लिए 404 फेंकते हैं)
मुझे एज रेल के खिलाफ परीक्षण में समस्या हो रही है, क्योंकि इसे लोड करते समय इसे निम्न त्रुटि का कारण बनता है सर्वर: foobar/विक्रेता/रेल/activesupport/lib/active_support/dependencies.rb: 440: `load_missing_constant 'में: अप्रारंभीकृत निरंतर ActionController :: फेलसेफ (NameError)
2 के वर्तमान प्रधान के खिलाफ परीक्षण किया है -3-स्थिर शाखा, 375e8976e3, और यह भी इस व्यवहार को प्रदर्शित करता है।
# संपादित 2 मैं नीचे ट्रैक करने का प्रयास किया जब परिवर्तन रेल codebase में हुई निर्धारित करने के लिए अगर यह जानबूझकर किया गया था। ऐसा लगता है कि this seemingly innocuous commit वह जगह है जहां बग शुरू होता है।
यहां उधार के विवरण हैं, जहां 404 वांछित व्यवहार को दर्शाता है, 200 अवांछित है।
2-3-stable branch 375e8976e3 - 200 b1c989f28d - 200 beca1f2e15 - 200 f1fff0a48 - 200 f1e20ce9a7 - 200 a5004573d8 - 200 2e1132fad8 - 200 - the difference seems to start at this commit c69d8c043f - 404 d961592886 - 404 276ec16007 - 404 0efec6452 - 404 13c6c3cfc5 - 404 fb2325e35 - 404 2-2 stable 3cb89257b4 - 404
यहाँ एक पैच है कि परिवर्तन है, जो जब v2.3.2.1 टैग करने के लिए है, यानी dc88847e5ce392eed210b97525c14fca55852867 लागू किया उलट जाता है, समस्या का समाधान होता है। हालांकि, मैं समझने के लिए पर्याप्त समझदार नहीं हूं कि यह प्रतीत होता है कि यह छोटा बदलाव वास्तव में एक अंतर क्यों देगा! शायद मेरे से ज्यादा स्मार्ट किसी स्थिति पर कुछ प्रकाश डाल सकता है?
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index 0facf70..0790807 100644
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -1403,12 +1403,9 @@ module ActionController #:nodoc:
end
Base.class_eval do
- [ Filters, Layout, Benchmarking, Rescue, Flash, MimeResponds, Helpers,
- Cookies, Caching, Verification, Streaming, SessionManagement,
- HttpAuthentication::Basic::ControllerMethods, HttpAuthentication::Digest::ControllerMethods,
- RecordIdentifier, RequestForgeryProtection, Translation
- ].each do |mod|
- include mod
- end
+ include Filters, Layout, Benchmarking, Rescue, Flash, MimeResponds, Helpers
+ include Cookies, Caching, Verification, Streaming, SessionManagement
+ include HttpAuthentication::Basic::ControllerMethods, HttpAuthentication::Digest::ControllerMethods
+ include RecordIdentifier, RequestForgeryProtection, Translation
end
end
# संपादित 3 पैच भी संबंधित बग, ऊपर का प्रदर्शन किया, जहां ठीक करने के लिए लगता है "XYms (DB: जेड) में पूरी की | 404 नहीं मिला [http://0.0.0.0/product/1234]" अप में नहीं दिखाया जा सका लकड़ी का लठा।
# संपादित 4 ऊपर पैच ActionPack में अन्य बातों के तोड़ दिया, तो मैं इसमें गहराई से और मुद्दा यह है कि संपार्श्विक क्षति का कारण नहीं है के लिए एक ठीक उत्पन्न। पैच और बाद के अपडेट the rails lighthouse
वास्तव में, यह उचित लगता है। आपके शोध और अंतर्दृष्टि के लिए धन्यवाद! –