2009-11-04 18 views
6

una domanda veloce rubino per voi:Come concatenare un hash ai parametri 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 

(credo ö codifica del genere, mi scusi se sbagliato) C'è un modo più semplice per fare questo che il seguente ?:

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

Non sto cercando di iniziare una guerra per il "migliore" modo di farlo - è solo che questo metodo sembra molto sfacciato e non rubino! Qualche consiglio?

risposta

21

Ecco un metodo più breve e più efficiente.

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

Assicurarsi di utilizzare questo con ' URI.escape' e non 'CGI.escape' perché quest'ultimo girerà' = 'in'% 3D'. – Pesto

0

Si può rendere un po 'più semplice utilizzando collect:

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

Non so quanto più è possibile semplificare esso che quello. Inoltre, nota che CGI.escape converte gli spazi in +, non %20. Se si desidera veramente %20, utilizzare invece URI.escape (è necessario specificare require 'uri').

0

probabilmente si dovrebbe provare a seguito

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

copiato da rails documentation. Non dimenticare di leggere i commenti sopra la definizione del metodo.

3

Rails fa questo per voi.

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" 

che decodificato sarebbe: "ids [] = 1 & ids [] = 2 & query = formaggio"

6

uso .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

il metodo più semplice è questo, grazie – user1735921

Problemi correlati