2010-02-16 12 views
20

के URL पैरामीटर के सभी प्राप्त करने के लिए कैसे निम्नलिखित सिनात्रा एप्लिकेशन का उपयोग करनाएक सिनात्रा एप्लिकेशन

get '/app' do 
    content_type :json 
    {"params" => params}.to_json 
end 

लागू:

{"params":{"param1":"one","param2":"alt"}}

:

/app?param1=one&param2=two&param2=alt

निम्न परिणाम देता है

पैराम्स में केवल दो कुंजी हैं, पैरा एम 1 & param2।

मुझे लगता है कि सिनात्रा एक हैश के रूप में पैरा सेट कर रहा है, लेकिन यह सभी यूआरएल अनुरोध का प्रतिनिधित्व नहीं करता है।

क्या अनुरोध में भेजे गए सभी यूआरएल पैरामीटर की सूची प्राप्त करने के लिए सिनात्रा में कोई रास्ता है?

उत्तर

18

मुझे विश्वास है कि उसी नाम के डिफ़ॉल्ट पैराम पर अंतिम बार संसाधित किए गए परम द्वारा अधिलेखित किया जाएगा।

आप कर सकते थे प्रकार

...&param2[]=two&param2[]=alt 

या क्वेरी स्ट्रिंग पार्स बनाम सिनात्रा पैरामीटर हैश प्रदान की की एक सरणी के रूप में सेटअप params2 या तो।

4

आप प्रक्रिया को और अधिक अनुकूल बनाने के लिए एक सहायक बना सकते हैं:

require 'cgi' 

helpers do  
    def request_params_repeats 
    params = {} 
    request.env["rack.input"].read.split('&').each do |pair| 
     kv = pair.split('=').map{|v| CGI.unescape(v)} 
     params.merge!({kv[0]=> kv.length > 1 ? kv[1] : nil }) {|key, o, n| o.is_a?(Array) ? o << n : [o,n]} 
    end 
    params 
    end 
end 

तब आप अपने get ब्लॉक में मापदंडों का उपयोग कर सकते हैं:

get '/app' do 
    content_type :json 
    request_params_repeats.to_json 
end 
+0

मेरे लिए काम नहीं करता है, मुझे लगता है कि rack.input स्ट्रीम पहले से ही sinatra द्वारा पढ़ी गई थी। –

9

क्वोन क्वेरी स्ट्रिंग पार्स करने का सुझाव देते हैं। आप इस प्रकार के रूप में यह पार्स करने के लिए सीजीआई का उपयोग कर सकते हैं:

require 'cgi' 

get '/app' do 
    content_type :json 
    {"params" => CGI::parse(request.query_string)}.to_json 
end 

लागू:

/app?param1=one&param2=two&param2=alt

निम्न परिणाम देता है:

{"params":{"param1":["one"],"param2":["two","alt"]}}

20

रैक में किसी भी अनुरोध

get '/app' do 
    params = request.env['rack.request.query_hash'] 
end 
+1

'rack.request.query_string' अगर आप कच्ची स्ट्रिंग चाहते हैं और हैश नहीं है। –

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