web-dev-qa-db-fra.com

Analyser une chaîne comme s'il s'agissait d'une chaîne de requête dans Ruby on Rails

J'ai une chaîne comme celle-ci:

"foo=bar&bar=foo&hello=hi"

Ruby on Rails fournit des méthodes pour analyser ceci comme s'il s'agissait d'une chaîne de requête, donc j'obtiens un hachage comme ceci:

{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}

Ou dois-je l'écrire moi-même?

ÉDITER

Veuillez noter que la chaîne ci-dessus n'est pas une véritable chaîne de requête à partir d'une URL, mais plutôt une chaîne stockée dans un cookie de Facebook Connect.

68
user142019

La réponse dépend de la version de Rails que vous utilisez. Si vous utilisez la version 2.3 ou ultérieure, utilisez l'analyseur intégré de Rack pour les paramètres

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}

Si vous utilisez des Rails plus anciens, vous pouvez en effet utiliser CGI::parse. Notez que la gestion des hachages et des tableaux diffère de manière subtile entre les modules, vous devez donc vérifier si les données que vous obtenez sont correctes pour la méthode que vous choisissez.

Vous pouvez également inclure Rack::Utils dans votre classe pour un accès raccourci.

150
Julik

Le

CGI::parse("foo=bar&bar=foo&hello=hi")

Vous donne

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
32
dombesz

Si vous parlez des URL qui sont utilisées pour obtenir des données sur les paramètres eux

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"

Ensuite, pour obtenir les paramètres de requête. utilisation

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
8
lokeshjain2008

Edit: comme indiqué dans les commentaires, les clés de symolisation peuvent faire tomber votre serveur si quelqu'un veut vous blesser. Je le fais toujours beaucoup lorsque je travaille sur des applications à profil bas, car cela facilite les choses, mais je ne le ferais plus pour les applications à fort enjeu

N'oubliez pas de symboliser les touches pour obtenir le résultat souhaité

Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys

cette opération est destructrice pour les doublons.

8
systho

Si vous voulez un hachage, vous pouvez utiliser

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]
1
Arnold Roa