2010-04-24 10 views
9

का उपयोग कर ब्लॉक के बीच डेटा पास करना मैं sinatra का उपयोग कर ब्लॉक के बीच डेटा पास करने की कोशिश कर रहा हूँ। उदाहरण के लिए:sinatra

@data = Hash.new 
post "/" do 
    @data[:test] = params.fetch("test").to_s 
    redirect "/tmp" 
end 

get "/tmp" do 
    puts @data[:test] 
end 

हालांकि जब भी मैं tmp block @data पर जाता हूं तो शून्य होता है और एक त्रुटि फेंकता है। ऐसा क्यों है?

उत्तर

14

कारण यह है कि ब्राउज़र वास्तव में दो अलग-अलग HTTP अनुरोध करता है।

Request: POST/
Response: 301 -> Location: /tmp 
Request: GET /tmp 
Response: ... 

दो अनुरोधों का अर्थ है दो अलग प्रक्रियाएं, इस प्रकार पहली प्रतिक्रिया भेजने के बाद @ डेटा आवृत्ति चर को साफ़ कर दिया जाता है। आप जानकारी सुरक्षित रखना चाहते हैं, तो आप, कुकीज़ या सत्र का उपयोग करने अन्यथा querystring

post "/" do 
    test = params[:test] 
    redirect "/tmp?test=#{test}" 
end 

get "/tmp" do 
    puts params[:test] 
end 
+0

एक आम जरूरत में डेटा पास की जरूरत है जब पुनः निर्देशित त्रुटियों/नोटिस प्रदर्शित करने के लिए सक्षम होने के लिए है। ऐसा लगता है कि कुछ लोग इसके लिए [sinatra-flash gem] (https://github.com/SFEley/sinatra-flash) का उपयोग करते हैं, जो सत्र-आधारित रणनीति का उपयोग करता है। Http://stackoverflow.com/a/7178664/1154642 देखें – bryanbraun

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