86 votes

Analyser une chaîne de caractères comme s'il s'agissait d'une chaîne de requête en Ruby on Rails

J'ai une chaîne de ce type :

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

Est-ce que Ruby on Rails fournit des méthodes pour analyser ceci comme s'il s'agissait d'une chaîne de requête, de sorte que j'obtienne un hachage comme celui-ci :

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

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

EDIT

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

176voto

Julik Points 3226

La réponse dépend de la version de Rails que vous utilisez. Si vous utilisez la version 2.3 ou une version 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 versions plus anciennes de Rails, vous pouvez en effet utiliser CGI::parse . Notez que la gestion des hachages et des tableaux diffère subtilement d'un module à l'autre. Vous devez donc vérifier si les données que vous obtenez sont correctes pour la méthode que vous avez choisie.

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

40voto

dombesz Points 5576

Le

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

Vous donne

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

Editer : Comme spécifié par Ryan Long cette version prend en compte les valeurs multiples de la même clé, ce qui est utile si vous souhaitez également analyser des tableaux.

Editer 2 :

En tant que Ben souligne que cela peut ne pas bien gérer les tableaux lorsqu'ils sont formatés avec la notation de tableau à la Ruby on Rails. La notation des tableaux dans le style de Ruby on Rails est la suivante : foo[]=bar&foo[]=nop . Ce style est en effet géré correctement avec Réponse de Julik .

Cette version n'analysera correctement que les tableaux, si vous avez des paramètres comme foo=bar&foo=nop .

15voto

systho Points 776

Editer : comme il a été dit dans les commentaires, la symolisation des clés peut faire tomber votre serveur si quelqu'un vous veut du mal. Je le fais encore souvent lorsque je travaille sur des applications à faible visibilité parce que cela facilite le travail, mais je ne le ferais plus pour des applications à fort enjeu.

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

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

cette opération est destructive pour les doublons.

9voto

lokeshjain2008 Points 522

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

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

Ensuite, pour obtenir les paramètres de la requête, utilisez

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

2voto

Arnold Roa Points 563

Si vous voulez un hachage, vous pouvez utiliser

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X