2011-11-07 14 views
8

मेरे पास एक स्ट्रिंग में एक यूआरएल है। इसमें कुछ पैरामीटर जोड़ने का सबसे संक्षिप्त तरीका क्या है?रूबी पर रूबी में बढ़ते मनमानी यूआरएल का निर्माण

उदा।

base = 'http://example.com' 
uri1 = some_magical_method(base, :p1 => 'v1') # => http://example.com/?p1=v1 
uri2 = some_magical_method(uri1, :p2 => 'v2') # => http://example.com/?p1=v1&p2=v2 
uri3 = some_magical_method(uri2, :p3 => nil) # => http://example.com/?p1=v1&p2=v2 

1) रुबी में?

2) रेल में?

उत्तर

16

रेल में, जहां ActiveSupport उपलब्ध है, हैश बनाने के लिए सबसे आसान तरीका है, फिर #to_query पर कॉल करें।

>> params = {} 
>> params[:foo] = "bar" 
>> params[:baz] = "bang" 
>> params.to_query 
=> "baz=bang&foo=bar" 

सादा रूबी में, एक ही लागू होता है, लेकिन आप अपने आप को एनकोडर लिखने के लिए की आवश्यकता होगी:

require 'cgi' 
def to_query(hsh) 
    hsh.map {|k, v| "#{k}=#{CGI::escape v}" }.join("&") 
end 

params = {} 
params[:foo] = "bar" 
params[:baz] = "bang" 

to_query params 
=> "baz=bang&foo=bar" 
+0

वहाँ एक कॉल वह भी क्वेरी स्ट्रिंग निकालने का ख्याल रखेंगे है यूआरएल से, फिर आपने जो कहा, वह कर रहा है, फिर मूल क्वेरी को नई क्वेरी स्ट्रिंग के साथ वापस कर रहा है? – user1015384

+0

आपकी सबसे अच्छी शर्त का उपयोग करना होगा [यूआरआई :: पार्स] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html#method-c-parse) से यूआरएल को इसके घटक टुकड़ों में विभाजित करें, फिर आप इसे अपने इच्छित टुकड़ों के साथ फिर से इकट्ठा कर सकते हैं। –

+0

यह प्रश्न प्रश्न के केवल एक पहलू का उत्तर देता है: क्वेरी स्ट्रिंग की पीढ़ी। इसे कैसे संलग्न करें? – schmijos

5
require 'open-uri' 

def params_to_query(params) 
    params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('&') 
end 

def append_url(url, params = {}) 
    uri = URI.parse(url) 
    uri.query = uri.query.nil? ? params_to_query(params) : [uri.query, params_to_query(params)].join('&') unless params.empty? 
    uri.to_s 
end 

puts append_url('http://example.com', {:query => 'my_example'} # "http://example.com?query=my_example" 
+0

धन्यवाद लेकिन मुझे और स्पष्ट होना चाहिए था। मैं जानना चाहता था कि रुबी और रेल के अंतर्निर्मित पुस्तकालयों का उपयोग करने के साथ क्या संभव था। – user1015384

+0

रेल में आपको केवल 'params_to_query (params) '' params.to_query' के साथ प्रतिस्थापित करने की आवश्यकता है। अन्य तर्क एक ही है। –

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