2011-01-11 10 views
6

in Python, posso fare questo:convertito rubino hash per URL string query ... senza quelle parentesi quadre

>>> 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] Io non riesco a capire come fare la stessa cosa senza "rolling my own", che sembra strano. Il modo in Rails non funziona per me - aggiunge parentesi quadre per i nomi dei parametri di query, che il server su l'altra estremità può o non può sostenere:

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

mio caso d'uso è semplicemente che io desidera eliminare i valori di alcuni valori nella porzione query-string dell'URL. E 'naturale per appoggiarsi alla libreria standard e/o Rails, e scrivere qualcosa del genere sembrava:

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) 

ma solo se l'URI risultante è infatti http://example.com/foo?a=b&a=c&a=d, e non http://example.com/foo?a[]=b&a[]=c&a[]=d. C'è un modo corretto o migliore per farlo?

+0

ho visto http://bit.ly/gc2Ylj, che mi ha spinto a scrivere velocemente https://gist.github.com/774142, che I * credo * compie ciò Voglio. Sebbene quello che volevo era * non * rotolare il mio. :-) – Charlie

risposta

0

Il modo in cui le rotaie gestiscono le stringhe di query di quel tipo significa che è necessario eseguire la propria soluzione, come si ha. È un po 'sfortunato se hai a che fare con app non-rail, ma ha senso se passi le informazioni da e verso le app.

6

Ecco una funzione veloce per trasformare il vostro hash in parametri di query:

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

Ordina i tasti in ordine alfabetico – mrudult

+0

Ciò non consente di evitare chiavi o valori. –

-1

Come una soluzione semplice semplice rubino (o RubyMotion, nel mio caso), basta usare questo:

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" 

E ' gestisce solo hash semplici, però.

17

In ruby ​​moderno questo è semplicemente:

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

Ecco la documentazione per stdlib-2.1.0: https://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html#method-c-encode_www_form –

1

Hash rapida a un URL query trucco:

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

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

vuole farlo in senso inverso? Usa CGI.parse:

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

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

# => {"language"=>["ruby"], "status"=>["awesome"]} 
Problemi correlati