2011-01-11 10 views
6

en Python, que puedo hacer esto:convertido rubí de hash a la pregunta URL cadena ... sin esos corchetes

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

en Ruby [rieles +] No puedo encontrar la manera de hacer la misma cosa sin "rodar el mío", lo cual parece extraño. La forma Carriles no funciona para mí - que añade entre corchetes a los nombres de los parámetros de la consulta, que el servidor en el otro extremo puede o no puede apoyar:

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

Mi caso de uso es simplemente que me desear desordenar con los valores de algunos de los valores en la parte query-string de la URL. Parecía natural que apoyarse en la biblioteca y/o rieles estándar, y escribir algo como esto:

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) 

pero sólo si el URI resultante es, de hecho, http://example.com/foo?a=b&a=c&a=d, y no http://example.com/foo?a[]=b&a[]=c&a[]=d. ¿Hay una forma correcta o mejor de hacer esto?

+0

me vi http://bit.ly/gc2Ylj, lo que me impulsó a escribir rápidamente https://gist.github.com/774142, que * think * logra lo Yo quiero. Aunque lo que quería era * no * hacer mi propio. :-) – Charlie

Respuesta

0

La forma en que los rieles manejan las cadenas de consulta de ese tipo significa que tiene que implementar su propia solución, como usted. Es algo desafortunado si se trata de aplicaciones que no son de rieles, pero tiene sentido si se pasa información desde y hacia aplicaciones de rieles.

6

Aquí es una función rápida para convertir su comprobación aleatoria, los parámetros de consulta:

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

Esto clasifica las teclas en orden alfabético – mrudult

+0

Esto no escapa correctamente las claves o valores. –

-1

Como solución Rubí llano simple (o RubyMotion, en mi caso), sólo tiene que utilizar esto:

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" 

Se solo maneja hashes simples, sin embargo.

17

En Ruby moderna esto es simplemente:

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

Aquí está la documentación para stdlib-2.1.0: https://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html#method-c-encode_www_form –

1

Hash rápido a una URL de consulta truco:

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

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

desea hacerlo a la inversa? Uso CGI.parse:

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

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

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