2009-11-04 9 views
6

आप के लिए एक त्वरित रूबी प्रश्न:URL पैरामीटर में हैश को कैसे सम्मिलित करें?

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"} 
p do_it(params) 
=> q=A%20query&foo=bar&nasty=Schr%C3%B6dinger%27s+cat 

(मैं ö ऐसा encodes, मुझे क्षमा इसकी गलत करता है, तो लगता है) वहाँ से निम्नलिखित ?:

def do_it(params) 
    out = [] 
    params.each_pair{|key,val| 
    out.push "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}" 
    } 
    out.join("&") 
end 

यह करने के लिए एक सरल तरीका है मैं ऐसा करने के लिए 'सर्वश्रेष्ठ' तरीके से युद्ध शुरू नहीं कर रहा हूं - यह सिर्फ यह विधि बहुत ही कमजोर और अनियमित दिखती है! कोई सुझाव?

उत्तर

21

यहां एक छोटी और अधिक कुशल विधि है।

def parameterize(params) 
    URI.escape(params.collect{|k,v| "#{k}=#{v}"}.join('&')) 
end 
+2

'के साथ इस का उपयोग सुनिश्चित करें URI.escape' और 'CGI.escape' नहीं है क्योंकि बाद वाला '=' '% 3 डी' में बदल जाएगा। – Pesto

0

आप collect का उपयोग कर इसे थोड़ा आसान बनाने के कर सकते हैं:

def do_it(params) 
    params.collect do |key,val| 
    "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}" 
    end.join('&') 
end 

मैं नहीं जानता कि कितना अधिक आपको लगता है कि तुलना में यह सरल बना सकते हैं। साथ ही, ध्यान दें कि CGI.escape रिक्त स्थान को + में परिवर्तित कर देगा, %20 नहीं। यदि आप वास्तव में %20 चाहते हैं, तो इसके बजाय URI.escape का उपयोग करें (आपको स्पष्ट रूप से require 'uri' करना होगा)।

0

आप शायद निम्नलिखित

def to_query(key) 
    "#{CGI.escape(key.to_s)}=#{CGI.escape(to_param.to_s)}" 
end 

rails documentation से नकल की कोशिश करनी चाहिए। विधि परिभाषा के ऊपर टिप्पणियों को पढ़ने के लिए मत भूलना।

3

रेल आपके लिए यह करता है।

params = {:ids => [1,2], :query => 'cheese'} 
out = ActionController::Routing::Route.new.build_query_string(params) 
=> "?ids%5B%5D=1&ids%5B%5D=2&query=cheese" 

जो डीकोड किया जाएगा: "आईडी [] = 1 & आईडी [] = 2 & क्वेरी = पनीर"

6

उपयोग .to_param

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"} 

params.to_param 
=> "foo=bar&nasty=Schr%C3%B6dinger%27s+cat&q=A+query" 
+0

यह सबसे आसान तरीका है, धन्यवाद – user1735921

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