2010-07-20 16 views
9

मैं एक रेल ऐप के लिए एक रैक मिडलवेयर घटक लिख रहा हूं जिसे सशर्त रूप से कुकीज़ सेट करने की आवश्यकता होगी। मैं वर्तमान में कुकीज़ सेट करने के लिए पता लगाने की कोशिश कर रहा हूं। इसके आसपास घूमने से ऐसा लगता है कि यह काम करना चाहिए:मैं कुकी (रूबी) रैक मिडलवेयर घटक के साथ कुकी कैसे सेट करूं?

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    @status, @headers, @response = @app.call(env) 
    @response.set_cookie("foo", {:value => "bar", :path => "/", :expires => Time.now+24*60*60}) 
    [@status, @headers, @response] 
    end 
end 

जो त्रुटियां नहीं देता है, लेकिन कुकी भी सेट नहीं करता है। मैं क्या गलत कर रहा हूं?

उत्तर

23

यदि आप प्रतिक्रिया वर्ग का उपयोग करना चाहते हैं, तो आपको इसे मिडलवेयर परत को ढेर के नीचे कॉल करने के परिणामों से तुरंत चालू करने की आवश्यकता है। इसके अलावा, आप इस तरह की एक मिडलवेयर के लिए उदाहरण चर की जरूरत नहीं है और शायद (के बाद अनुरोध परोसा जाता है मिडलवेयर उदाहरण में चारों ओर रहना होता @ स्थिति, आदि)

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
    # confusingly, response takes its args in a different order 
    # than rack requires them to be passed on 
    # I know it's because most likely you'll modify the body, 
    # and the defaults are fine for the others. But, it still bothers me. 

    response = Rack::Response.new body, status, headers 

    response.set_cookie("foo", {:value => "bar", :path => "/", :expires => Time.now+24*60*60}) 
    response.finish # finish writes out the response in the expected format. 
    end 
end 
उन्हें उस तरह से उपयोग करने के लिए नहीं करना चाहते हैं

यदि आप जानते हैं कि आप क्या कर रहे हैं तो आप कुकी हेडर को सीधे संशोधित कर सकते हैं, अगर आप एक नई ऑब्जेक्ट को तुरंत चालू नहीं करना चाहते हैं।

+0

बहुत बढ़िया। यह मेरे लिए पूरी तरह से काम कर रहा है। अब तक का सबसे स्पष्ट उदाहरण मैंने देखा है। – phaedryx

+0

धन्यवाद! पांच साल बाद, यह स्निपेट वही था जो मैं ढूंढ रहा था। – Anurag

+0

@BaroqueBobcat यह वास्तव में उपयोगी होगा यदि आपने यह भी शामिल किया कि आप कुकी को सीधे कैसे संशोधित कर सकते हैं। महान जवाब के लिए धन्यवाद! – thesecretmaster

13

आप रैक :: प्रतिक्रिया ऑब्जेक्ट के बिना हेडर सेट करने और हटाने के लिए Rack::Utils लाइब्रेरी का भी उपयोग कर सकते हैं।

class RackApp 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 

    Rack::Utils.set_cookie_header!(headers, "foo", {:value => "bar", :path => "/"}) 

    [status, headers, body] 
    end 
end 
संबंधित मुद्दे