2011-01-11 16 views
6

In Python, ich kann dies tun:convert Rubin Hash Query-String-URL ... ohne diese eckigen Klammern

>>> import urlparse, urllib 
>>> q = urlparse.parse_qsl("a=b&a=c&d=e") 
>>> urllib.urlencode(q) 
'a=b&a=c&d=e' 

In Ruby [+ Rails] Ich kann nicht herausfinden, wie die gleiche Sache zu tun ohne "mein eigenes zu rollen", was merkwürdig erscheint. Der Rails Weg für mich nicht funktioniert - es fügt eckige Klammern die Namen der Abfrageparameter, die der Server am anderen Ende kann oder nicht unterstützen kann:

>> q = CGI.parse("a=b&a=c&d=e") 
=> {"a"=>["b", "c"], "d"=>["e"]} 
>> q.to_params 
=> "a[]=b&a[]=c&d[]=e" 

Mein Anwendungsfall ist einfach, dass ich möchte mit den Werten einiger der Werte im query-string Teil der URL meckern. Es schien natürlich auf der Standardbibliothek zu lehnen und/oder Rails, und schreiben Sie etwas wie folgt aus:

uri = URI.parse("http://example.com/foo?a=b&a=c&d=e") 
q = CGI.parse(uri.query) 
q.delete("d") 
q["a"] << "d" 
uri.query = q.to_params # should be to_param or to_query instead? 
puts Net::HTTP.get_response(uri) 

aber nur, wenn die resultierende URI in der Tat ist http://example.com/foo?a=b&a=c&a=d und nicht http://example.com/foo?a[]=b&a[]=c&a[]=d. Gibt es einen richtigen oder besseren Weg, dies zu tun?

+0

Ich habe http://bit.ly/gc2Ylj, die mich dazu veranlasst, schnell schreiben https://gist.github.com/774142, die ich denke, * * leistet, was Ich will. Aber was ich wollte, war, dass ich nicht mein eigenes rollen sollte. :-) – Charlie

Antwort

0

Die Art und Weise, wie Rails Abfragezeichenfolgen dieses Typs behandelt, bedeutet, dass Sie Ihre eigene Lösung rollen müssen, wie Sie haben. Es ist etwas bedauerlich, wenn Sie mit Nicht-Rails-Apps arbeiten, aber es ist sinnvoll, wenn Sie Informationen zu und von Rails-Apps weitergeben.

6

Hier ist eine schnelle Funktion Ihre Hash in Abfrageparameter zu aktivieren:

require 'uri' 
def hash_to_query(hash) 
    return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&")) 
end 
+0

Dies sortiert die Schlüssel in alphabetischer Reihenfolge – mrudult

+0

Dies nicht ordnungsgemäß Tasten oder Werte. –

-1

Als einfache Ebene Ruby-Lösung (oder RubyMotion, in meinem Fall), das nur verwenden:

class Hash 
    def to_param 
    self.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join("&") 
    end 
end 

{ fruit: "Apple", vegetable: "Carrot" }.to_param # => "fruit=Apple&vegetable=Carrot" 

Es behandelt jedoch nur einfache Hashes.

17

In modernen Rubin dieses ist einfach:

require 'uri' 
URI.encode_www_form(hash) 
+0

Hier ist die Dokumentation für stdlib-2.1.0: https://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html#method-c-encode_www_form –

1

Schnell Hash zu einer URL-Abfrage Trick:

"http://www.example.com?" + { language: "ruby", status: "awesome" }.to_query 

# => "http://www.example.com?language=ruby&status=awesome" 

Wollen Sie es in umgekehrter Richtung zu tun? Verwendung CGI.parse:

require 'cgi' 
# Only needed for IRB, Rails already has this loaded 

CGI::parse "language=ruby&status=awesome" 

# => {"language"=>["ruby"], "status"=>["awesome"]} 
Verwandte Themen