Eso es bastante fácil con un simple hash como
{:a => "a", :b => "b"}
lo que se traduciría en
"a=a&b=b"
¿Pero qué haces con algo más complejo como
{:a => "a", :b => ["c", "d", "e"]}
que debería traducirse en
"a=a&b[0]=c&b[1]=d&b[2]=e"
O peor aún, (qué hacer) con algo como:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
¡Gracias por la apreciada ayuda con eso!
ruby
http
parameters
hashmap
Julien Genestoux
fuente
fuente
Respuestas:
Actualización: esta funcionalidad se eliminó de la gema.
Julien, tu respuesta es buena, y me la tomé descaradamente, pero no escapa de los personajes reservados, y hay algunos otros casos extremos en los que se descompone.
La gema es ' direccionable '
fuente
query_values
mutador.Para hashes básicos no anidados, Rails / ActiveSupport tiene
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
fuente
require 'active_support/all'
es necesarioto_query
no maneja los valores nulos correctamente.{ a: nil, b: '1'}.to_query == "a=&b=1"
, pero Rack y CGI se analizana=
como una cadena vacía, nonil
. No estoy seguro sobre el soporte para otros servidores, pero con los rieles, la cadena de consulta correcta debería sera&b=1
. Creo que está mal que Rails no pueda producir una cadena de consulta que seSi está utilizando Ruby 1.9.2 o posterior, puede usarlo
URI.encode_www_form
si no necesita matrices.Por ejemplo (de los documentos de Ruby en 1.9.3):
Notarás que los valores de la matriz no están configurados con nombres de claves que contienen
[]
como todos a los que estamos acostumbrados en las cadenas de consulta. La especificación queencode_www_form
utiliza está de acuerdo con la definición deapplication/x-www-form-urlencoded
datos HTML5 .fuente
{:c => "c", :d => true}
parece ser inspeccionado, por lo que se envía como una cadena.ruby -ruri -e 'puts RUBY_VERSION; puts URI.encode_www_form({:a => "a", :b => {:c => "c", :d => true}, :e => []})' # outputs 2.0.0 a=a&b=%7B%3Ac%3D%3E%22c%22%2C+%3Ad%3D%3Etrue%7D&
Addressable::URI
y ActiveSupportObject#to_query
.No es necesario cargar el ActiveSupport hinchado o rodar el suyo, puede usar
Rack::Utils.build_query
yRack::Utils.build_nested_query
. Aquí hay una publicación de blog que da un buen ejemplo:Incluso maneja matrices:
O las cosas anidadas más difíciles:
fuente
:b
es una matriz de dos hashes. Terminas:b
siendo un conjunto de un hash más grande.require 'rack'
? Debe estar allí, teniendo en cuenta que todos los principales marcos web de Ruby están construidos sobre Rack ahora.to_query
también combina las 2 matrices (v4.2).Robar de Merb:
Ver http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
fuente
Aquí hay un breve y dulce delineador si solo necesita admitir cadenas de consulta de clave / valor ASCII simples:
fuente
fuente
Aquí hay otra forma. Para consultas simples.
fuente
Sé que esta es una vieja pregunta, pero solo quería publicar este fragmento de código ya que no pude encontrar una gema simple para hacer esta tarea por mí.
Enrollado como gema aquí: https://github.com/simen/queryparams
fuente
URI.escape != CGI.escape
y para la URL quieres la primera.CGI.escape("http://localhost/search?q=banana&limit=7")
=> "http%3A%2F%2Flocalhost%2Fsearch%3Fq%3Dbanana%26limit%3D7"
URI.escape("http://localhost/search?q=banana&limit=7")
=> "http://localhost/search?q=banana&limit=7"
El mejor enfoque es usar Hash.to_params, que es el que funciona bien con las matrices.
fuente
require 'active_support/all'
es necesarioSi se encuentra en el contexto de una solicitud de Faraday, también puede pasar el hash de params como el segundo argumento y faraday se encarga de hacer que la URL de param adecuada forme parte de él:
fuente
Me gusta usar esta gema:
https://rubygems.org/gems/php_http_build_query
Uso de la muestra:
fuente
fuente