ruby-on-rails - permitted - rails permit param
Analizar una cadena como si fuera una cadena de consulta en Ruby on Rails (5)
Tengo una cadena como esta:
"foo=bar&bar=foo&hello=hi"
Ruby on Rails proporciona métodos para analizar esto como si fuera una cadena de consulta, así que obtengo un hash como este:
{
:foo => "bar",
:bar => "foo",
:hello => "hi"
}
¿O debo escribirlo yo mismo?
EDITAR
Tenga en cuenta que la cadena de arriba no es una cadena de consulta real de una URL, sino una cadena almacenada en una cookie de Facebook Connect.
La respuesta depende de la versión de Rails que esté usando. Si está utilizando 2.3 o posterior, use el analizador incorporado de Rack para params
Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
Si estás en Rails anteriores, puedes usar CGI::parse
. Tenga en cuenta que el manejo de hash y arrays difiere de manera sutil entre los módulos, por lo que debe verificar si los datos que está obteniendo son correctos para el método que elija.
También puede incluir Rack::Utils
en su clase para obtener acceso abreviado.
Si habla de las URL que se utilizan para obtener datos sobre los parámetros,
> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"
Luego para obtener los parámetros de consulta. utilizar
> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
Si quieres un hash puedes usar
Hash[CGI::parse(x).map{|k,v| [k, v.first]}]
los
CGI::parse("foo=bar&bar=foo&hello=hi")
Te dio
{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
Editar: como se dijo en los comentarios, las claves de simulación pueden hacer que su servidor pierda si alguien quiere lastimarlo. Todavía lo hago mucho cuando trabajo en aplicaciones de perfil bajo porque hace que trabajar sea más fácil pero no lo haría más para aplicaciones de alto nivel.
No olvides simbolizar las claves para obtener el resultado que deseas
Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys
esta operación es destructiva para los duplicados.