strong rails permitted permit new ruby url parameters

ruby - rails - Agregar parámetro a url



rails permit param (4)

Como Ruby ha evolucionado a lo largo de los años, la respuesta difiere entre versiones.

Después de 1.9.2

Ruby 1.9.2 vio decode_www_form y encode_www_form agregados al módulo URI, facilitando los parámetros de codificación.

require ''uri'' uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo") new_query_ar = URI.decode_www_form(uri.query || '''') << ["wmode", "opaque"] uri.query = URI.encode_www_form(new_query_ar) puts uri.to_s

Explicación

URI.decode_www_form rompe una cadena de parámetros de consulta ( uri.query ) en una matriz anidada de parámetros ( [["v", "og9B3BEnBHo"]] )

uri.query || '''' uri.query || '''' suministra la cadena de consulta del uri o, si no existe, una cadena vacía. Esto evita que decode_www_form ejecute en un error si uri.query es nil .

<< ["wmode", "opaque"] agrega otro elemento a la matriz de parámetros de consulta. Puede agregar más extendiendo new_query_ar : new_query_ar << ["fullscreen", "1"]

URI.encode_www_form codifica los nuevos parámetros de consulta de la matriz anidada en una cadena.

Antes de 1.9.2

require ''uri'' uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo") uri.query = [uri.query, "wmode=opaque"].compact.join(''&'') puts uri.to_s

Explicación

[uri.query, "wmode=opaque"] es una matriz de todos los parámetros de consulta eventuales. Puede agregar más ampliando la matriz: [uri.query, "wmode=opaque", "fullscreen=1"] o agregando al elemento final: "wmode=opaque&fullscreen=1"

compact elimina nil elementos de una matriz, por lo que elimina uri.query si no hay un parámetro de consulta existente.

join , finalmente, los une en una cadena de consulta.

Tengo una url (por ejemplo, http://www.youtube.com/watch?v=og9B3BEnBHo ) y me gustaría agregarle un parámetro (wmode = opaque) para que sea:

http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque

¿Alguien puede decirme qué función usar para que esto funcione?


Dado que puede tener varios parámetros de consulta que desea agregar y no solo uno, aquí hay una versión que le permite agregar tantos parametros como desee simplemente pasando un hash ... Además, un Hash parece una forma más natural de pasar params todos modos, incluso si solo está agregando un param.

require ''uri'' def add_params(url, params = {}) uri = URI(url) params = Hash[URI.decode_www_form(uri.query || '''')].merge(params) uri.query = URI.encode_www_form(params) uri.to_s end

Ejemplos:

pry(main)> helper.add_params("http://example.com", b: 2) => "http://example.com?b=2" pry(main)> helper.add_params("http://example.com?a=1", b: 2, c: 3) => "http://example.com?a=1&b=2&c=3" pry(main)> helper.add_params("http://www.youtube.com/watch?v=og9B3BEnBHo", wmode: ''opaque'') => "http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque"


Otra opción es usar la gema direccionable

https://github.com/sporkmonger/addressable

Una vez que incluya direccionable en su proyecto, todo lo que tendrá que hacer es:

url = Addressable::URI.parse(''http://www.youtube.com/watch?v=og9B3BEnBHo'') url.query_values = url.query_values.merge(wmode:"opaque")


require ''uri'' uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo") uri.query = [uri.query, "wmode=opaque"].compact.join(''&'') puts uri.to_s #edit Since 1.9.2 there are methods added to the URI module uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo") new_query_ar = URI.decode_www_form(String(uri.query)) << ["wmode", "opaque"] uri.query = URI.encode_www_form(new_query_ar) puts uri.to_s

(La llamada a String asegura que esto también funciona en el caso cuando el URI original no tiene una cadena de consulta)