2011-11-07 9 views
8

Tengo una URL en una cadena. ¿Cuál es la forma más concisa de agregarle algunos parámetros?Creando URLs arbitrarias de forma incremental en Ruby on Rails

p. Ej.

base = 'http://example.com' 
uri1 = some_magical_method(base, :p1 => 'v1') # => http://example.com/?p1=v1 
uri2 = some_magical_method(uri1, :p2 => 'v2') # => http://example.com/?p1=v1&p2=v2 
uri3 = some_magical_method(uri2, :p3 => nil) # => http://example.com/?p1=v1&p2=v2 

1) ¿En Ruby?

2) ¿En los rieles?

Respuesta

16

En Rails, donde está disponible ActiveSupport, la manera más fácil es construir un hash, luego llamar al #to_query en él.

>> params = {} 
>> params[:foo] = "bar" 
>> params[:baz] = "bang" 
>> params.to_query 
=> "baz=bang&foo=bar" 

En la llanura Ruby, lo mismo se aplica, pero tendrá que escribir el codificador mismo:

require 'cgi' 
def to_query(hsh) 
    hsh.map {|k, v| "#{k}=#{CGI::escape v}" }.join("&") 
end 

params = {} 
params[:foo] = "bar" 
params[:baz] = "bang" 

to_query params 
=> "baz=bang&foo=bar" 
+0

¿Hay una sola llamada, que también se hará cargo de la extracción de la cadena de consulta desde una URL, luego haciendo lo que dijiste, y luego devolviendo la URL original con la nueva cadena de consulta? – user1015384

+0

Lo mejor que puede hacer es usar [URI :: parse] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html#method-c-parse) para divide la URL en sus componentes, luego puedes volver a armarla con las piezas que te interesan. –

+0

Esta pregunta responde solo a un aspecto de la pregunta: la generación de una cadena de consulta. ¿Cómo agregarlo? – schmijos

5
require 'open-uri' 

def params_to_query(params) 
    params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('&') 
end 

def append_url(url, params = {}) 
    uri = URI.parse(url) 
    uri.query = uri.query.nil? ? params_to_query(params) : [uri.query, params_to_query(params)].join('&') unless params.empty? 
    uri.to_s 
end 

puts append_url('http://example.com', {:query => 'my_example'} # "http://example.com?query=my_example" 
+0

Gracias, pero debería haber sido más claro. Quería saber qué era posible con el uso de las bibliotecas incorporadas de Ruby and Rails. – user1015384

+0

En Rails solo necesita reemplazar 'params_to_query (params)' con 'params.to_query'. Otras lógicas son iguales. –