2009-04-20 111 views
8

नोट यह मूल रूप से 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

उत्तर

16

ऐसा लगता है कि include(X, Y, Z) वास्तव में include X; include Y; include Z से भिन्न क्रम में संचालित होता है।

नीचे मैंने सी कोड चिपकाया है जो मॉड्यूल # लागू करता है रूबी 1.8.6 में विधि शामिल है।

static VALUE 
rb_mod_include(argc, argv, module) 
    int argc; 
    VALUE *argv; 
    VALUE module; 
{ 
    int i; 

    for (i=0; i<argc; i++) Check_Type(argv[i], T_MODULE); 
    while (argc--) { 
     rb_funcall(argv[argc], rb_intern("append_features"), 1, module); 
     rb_funcall(argv[argc], rb_intern("included"), 1, module); 
    } 
    return module; 
} 

भले ही आप रूबी के सी internals से परिचित नहीं हैं, यह बहुत स्पष्ट है इस समारोह पाश ऊपर की ओर पुनरावृत्ति की जाँच करें कि सभी तर्क का प्रकार T_MODULE है, और फिर के लिए एक एक समय पाश-बार दोहराना का उपयोग करता है वास्तव में मॉड्यूल को शामिल करने के लिए नीचे - इसलिए include(X, Y, Z) में मॉड्यूल वास्तव में Z, Y, X क्रम में शामिल किए जाएंगे। मैं प्रश्न में सभी रेल मॉड्यूल से गुजर चुका नहीं हूं, लेकिन मुझे लगता है कि ऑर्डर-निर्भर कुछ ऐसा है जो ऑर्डर को बदलने के बाद विफल होने लगा।

+0

वास्तव में, यह उचित लगता है। आपके शोध और अंतर्दृष्टि के लिए धन्यवाद! –

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