2014-09-20 3 views
0

J'essaye d'itérer une URL pour gratter. Qu'est-ce qui me manque dans ma syntaxe?Syntaxe des boucles

array = [1...100] 

array.each do |i| 
    a = 'http://www.web.com/page/#{i}/'.scrapify(images: [:png, :gif, :jpg]) 
    extract_images(a[:images]) 
end 
+0

Il ne peut pas trouver mon url ... quelque chose ne va pas dans la boucle – Gibson

Répondre

2

array = [1...100] ne fait pas ce que vous pensez. Cela crée un tableau avec un seul élément et cet élément unique est une instance Range dont la première valeur est 1 et dont la dernière valeur est 99.

Ainsi, après le tri votre problème d'interpolation de chaîne (comme indiqué elsewhere), ceci:

"http://www.web.com/page/#{i}/" 

sera la chaîne:

"http://www.web.com/page/1...100/" 

et le serveur distant ne sait probablement pas ce que cela veut dire que ça va soit 404 soit vous donner la première page; Vos commentaires ailleurs suggèrent qu'il vous donnera la première page et ignorer la partie ...100 de l'URL.

Si vous voulez boucle de 1 à 99 vous dirais:

(1...100).each do |i| 
    # `i` will range from 1 to 99 in this block 
end 

Si vous voulez boucle 1-100 vous utiliseriez .. au lieu de ...:

(1..100).each do |i| 
    # `i` will range from 1 to 100 in this block 
end 

Vous pouvez également abandonner complètement la plage et utiliser times:

99.times do |i| 
    # `i` will range from 0 to 98 in this block so 
    # you'd work with `i+1` 
end 

100.times do |i| 
    # `i` will range from 0 to 99 in this block so 
    # you'd work with `i+1` 
end 

ou upto (grâce à JKillian pour le rappel de celui-ci):

1.upto(99) do |i| 
    # `i` will range from 1 to 99 in this block 
end 

1.upto(100) |i| 
    # `i` will range from 1 to 100 in this block 
end 
+2

J'aime personnellement ['1.upto (99)'] (http://ruby-doc.org/core-2.1.2/Integer.html#method-i-upto) parce que cela me semble le plus clair. Néanmoins, c'est la meilleure réponse car elle aborde toutes les questions de l'OP – JKillian

+0

@JKillian: Je pense que «topt» serait probablement le meilleur, merci pour le rappel. Je fais rarement ce genre de boucle dans Ruby, je trouve 'each_with_index' ou' with_index' plus commun. –

2

Pour interpolation vous devez utiliser des guillemets doubles (" " au lieu ' '):

array = [1...100] 

array.each do |i| 
    a = "http://www.web.com/page/#{i}/".scrapify(images: [:png, :gif, :jpg]) 
    extract_images(a[:images]) 
end 
+0

encore ne peut pas trouver l'URL, étrange! – Gibson

+0

pas sûr mais essayez de supprimer la barre oblique '/' de l'URL. –

+0

Ok travaillé. C'était parce que la page n'avait pas 100 pages, donc elle ne le trouverait pas. Tu avais raison. Merci! – Gibson