2009-11-04 14 views
6

una pregunta rápida para usted Rubí:¿Cómo concatenar un hash a los parámetros de 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 

(creo que codifica ö así, discúlpeme si su mal) ¿Existe una manera más sencilla de hacer esto que la siguiente ?:

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

No estoy buscando comenzar una guerra sobre la 'mejor' manera de hacer esto - ¡es solo que este método parece muy tonto y sin rubíes! ¿Algun consejo?

Respuesta

21

Aquí hay un método más corto y más eficiente.

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

Asegúrese de utilizar esto con ' URI.escape' y no 'CGI.escape' porque este último convertirá ese' = 'en'% 3D'. – Pesto

0

Puede que sea un poco más sencillo el uso de collect:

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

No sé cuánto más se puede simplificar que eso. Además, tenga en cuenta que CGI.escape convertirá espacios en +, no en %20. Si realmente quiere %20, use URI.escape en su lugar (tendrá que require 'uri', obviamente).

0

probablemente debería seguir los siguientes pasos

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

copiado de rails documentation. No olvide leer los comentarios sobre la definición del método.

3

Rails hace esto por usted.

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" 

el cual decodifica sería: "? Ids [] = 1 & ids [] = 2 & consulta = queso"

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

el método más fácil es este, gracias – user1735921

Cuestiones relacionadas