2011-04-13 3 views
6

Si j'ai quelque chose comme URL ci-dessous:tableau lecture de params dans RoR

http://test.com?x=1&x=2&x=3&x=4&x=5&x=6&x=7 

Alors, comment puis-je lire toutes les valeurs « x »?

Nouveau commentaire ajouté: Merci pour toutes vos réponses. Je suis fondamentalement d'origine Java et .Net et j'ai récemment commencé à chercher Ruby et Rails. Comme dans Java, n'avons-nous pas quelque chose de similaire à request.getParameterValues ​​("x");

+1

Votre URL ne devrait-elle pas être 'http: //test.com? x = 1,2,3,4,5,6,7' à la place, ou quelque chose de similaire? – ANeves

+1

est-ce une requête http rails et vous voulez analyser x dans votre action ou vous avez une URL en tant que chaîne et que vous voulez analyser? –

+2

Non, les rails n'ont pas la fonctionnalité request.getParameterValues ​​("x"). Comme PHP, les paramètres de requête doivent être spécifiés avec le suffixe "[]" s'il doit y avoir plusieurs valeurs. Honnêtement, j'ai toujours trouvé cela ennuyeux, car cela signifie que vous ne pouvez pas remplacer un backend écrit en utilisant Servlets avec un écrit en utilisant Rails sans (si vous utilisez le pattern params à valeurs multiples) les changements à l'extrémité frontale. – RHSeeger

Répondre

3

S'IL EST UNE CHAÎNE, mais pas une demande http

Pour ce faire:

url = 'http://test.com?x=1&x=2&x=3&x=4&x=5&x=6&x=7' 

p url.split(/(?:\A.*?|&)x=/).drop(1) 

Si vous voulez les convertir en nombres entiers, faire:

p url.split(/(?:\A.*?|&)x=/).drop(1).map(&:to_i) (ruby 1.9) 

ou

p url.split(/(?:\A.*?|&)x=/).drop(1).map{|v| v.to_i} 
+0

désolé j'ai édité votre commentaire – fl00r

+0

@ fl00r Votre édition précédente a été réellement utile. – sawa

2

S'IL EST UNE CHAÎNE, mais pas une demande http Je ne ai même pas imaginer si l'auteur ne sait pas comment gérer params url demande ...

url = "http://test.com?x=1&x=2&x=3&x=4&x=5&x=6&x=7" 
vars = url.scan(/[^?](x)=([^&]*)/) 
#=> [["x", "2"], ["x", "3"], ["x", "4"], ["x", "5"], ["x", "6"], ["x", "7"]] 
x = vars.map{|a| a[1]} 
#=> ["2", "3", "4", "5", "6", "7"] 
x.map!(&:to_i) 
#=> [2, 3, 4, 5, 6, 7] 

Ou si vous avez besoin d'extraire valuse seulement:

vars = url.scan(/[^?]x=([^&]*)/).flatten 
#=> ["2", "3", "4", "5", "6", "7"] 
vars = url.scan(/[^?]x=([^&]*)/).flatten.map(&:to_i) 
#=> [2, 3, 4, 5, 6, 7] 
+2

Merci pour le montage de la mienne. Quelqu'un semble nous déprimer. Si la question ne voulait pas dire chaîne, alors la question était ambiguë. Nous ne devrions pas être déprimés à cause de cela. – sawa

+0

C'était accidentellement :) Et je suis totalement d'accord :) +1 – fl00r

+0

Merci pour toutes vos réponses. Je suis fondamentalement d'origine Java et .Net et j'ai récemment commencé à chercher Ruby et Rails. Comme dans Java, n'avons-nous pas quelque chose de similaire à request.getParameterValues ​​("x"); –

26

vous devez utiliser url suivante au lieu du vôtre:

http://test.com?x[]=1&x[]=2 

et vous obtiendrez ces params comme rray:

p params[:x] # => ["1", "2"] 
+0

convenu. Cela a du sens dans le contexte des rails –

+0

J'ai trouvé que Rails 4.2.5 comprend la sérialisation des parenthèses donc params [: x] fonctionnait encore même si mes crochets étaient en sérialisation dans l'URL. J'utilise AngularJS qui convertissait x [] en x% 5B% 5D. – Usagi