2009-04-15 6 views
7

J'ai une URL de la forme http://www.example.com?foo=one&foo=twocomment analyser de champ multivalué requête URL dans Rails

Je veux obtenir un tableau de valeurs ['one', 'two'] pour foo, mais params[:foo] ne retourne la première valeur.

Je sais que si j'ai utilisé foo[] au lieu de foo dans l'URL, alors params[:foo] me donnerait le tableau désiré.

Toutefois, je souhaite éviter de modifier la structure de l'URL si possible, car sa forme est fournie en tant que spécification à une application cliente. est-il un bon moyen d'obtenir toutes les valeurs sans changer le nom du paramètre?

Répondre

13

Vous pouvez utiliser le module par défaut Ruby CGI pour analyser la chaîne de requête dans un contrôleur Rails comme ceci:

params = CGI.parse(request.query_string) 

Cela vous donnera ce que vous voulez, mais notez que vous ne recevrez pas de Rails d'autres extensions à l'analyse syntaxique des chaînes de requête, telles que l'utilisation de HashWithIndifferentAccess, de sorte que vous devrez utiliser des chaînes plutôt que des symboles.

En outre, je ne crois pas que vous pouvez définir des paramètres comme celui-ci avec une seule ligne et remplacer le contenu par défaut des rails. En fonction de l'ampleur de ce changement, vous devrez peut-être corriger un peu le singe ou pirater les internals. Cependant la chose rapide si vous voulez un changement global serait de mettre cela dans un filtre avant application.rb et utiliser une nouvelle instance var comme @raw_params

+0

fonctionne comme un charme, merci. J'en avais juste besoin en un seul endroit dans un contrôleur, donc je n'ai même pas eu besoin de bourrer avec des params. – ykaganovich

2

J'aime la solution CGI.parse (de request.query_string) mentionné dans une autre réponse. Vous pouvez le faire pour fusionner la chaîne de requête personnalisée analysée en paramètres:

params.merge!(CGI.parse(request.query_string).symbolize_keys) 
+8

La symbolisation automatique vous ouvrira une attaque DoS sur votre application. Ruby ne collecte jamais les instances de Symbol, elles restent donc en mémoire, ne faisant rien, jusqu'à ce que l'application soit redémarrée. –

+1

@ FrançoisBeausoleil - Avez-vous un lien expliquant ce problème plus en détail? Est-ce encore un problème dans Ruby 1.9.2/Rails 3? –

+0

@MattHuggins - Voir https://bugs.ruby-lang.org/issues/7791. Et le problème est censé être résolu en 2.2. –

Questions connexes