2011-05-27 6 views
19

El mecanismo de generación de URL de Rails (la mayoría de las rutas a través de polymorphic_url en algún punto) permite pasar un hash que se serializa en una cadena de consulta al menos para las solicitudes GET. ¿Cuál es la mejor manera de obtener ese tipo de funcionalidad, pero en la parte superior de cualquier camino de base?¿Hay una biblioteca/gema de Ruby que genere una URL basada en un conjunto de parámetros?

Por ejemplo, me gustaría tener algo como lo siguiente:

generate_url('http://www.google.com/', :q => 'hello world') 
    # => 'http://www.google.com/?q=hello+world' 

no me resultaba difícil escribir mi propio que se adapte estrictamente los requerimientos de mi aplicación, pero si existiera alguna biblioteca canónica a cuidar de él , Prefiero usar eso :).

Respuesta

31

Sí, en la biblioteca estándar de Ruby encontrará todo un módulo de clases para trabajar con URI. Hay uno para HTTP. Puede llamar al #build con algunos argumentos, al igual que mostró.

http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/HTTP.html#M009497

Por la propia cadena de consulta, sólo tiene que utilizar los carriles Hash Además #to_query. es decir,

uri = URI::HTTP.build(:host => "www.google.com", :query => { :q => "test" }.to_query) 
+1

maravilloso! No puedo decir que haya visto el módulo URI antes, así que esto es genial. –

+2

'método indefinido 'to_query' para # (NoMethodError)' – Nakilon

+0

@Nakilon ¿qué versión de Rails está usando? – d11wtq

2

tarde a la fiesta, pero me dejó recomiendan altamente la gema Addressable. Además de sus otras funciones útiles, admite la escritura y el análisis de uri a través del RFC 6570 URI templates. Para adaptar el ejemplo dado, tratar:

gsearch = Addressable::Template.new('http://google.com/{?query*}') 
gsearch.expand(query: {:q => 'hello world'}).to_s 
# => "http://www.google.com/?q=hello%20world" 

o

gsearch = Addressable::Template.new('http://www.google.com/{?q}') 
gsearch.expand(:q => 'hello world').to_s 
# => "http://www.google.com/?q=hello%20world" 
+0

compruebe esta [URL] (http://stackoverflow.com/help) será útil para aumentar la calidad de su contenido –

+0

Limpió y agregó ejemplos. Gracias @willie! – wobh

+0

Me di cuenta de que la gema Thor solo usa direccionable para Ruby 1.8. ¿Se agregó algo después de eso para que ya no fuera necesario? – labyrinth

Cuestiones relacionadas