2016-07-21 8 views
0

Ich habe eine Frage über die Verwendung von foreach Schleifen in Ruby.Abrufen von Daten mit der for-Schleife in Ruby

Ich möchte Dokumente anzeigen und verwende eine foreach Schleife, um diese Dokumente anzuzeigen. Es gibt einen Fehler mit der i Variablen in data["response"]["docs"][i]["topic"] zurück, die eine JSON-Zeichenfolge ist, über die ich iteriere.

Ich verstehe nicht, warum das so ist. Kann mir jemand sagen, was ich falsch mache?

Wenn ich einfach data["response"]["docs"][0]["topic"] tun, funktioniert es gut, aber nicht mit der i. Warum das?

<% 
(0..10).each do |i| 
%> 
<%= i %> <br/> 
<%= data["response"]["docs"][i]["topic"] %> 
<% 
end 
%> 
+1

Anstatt '(0..10)' betrachten mit 'n.times' wo' n 'ist die Anzahl der Wiederholungen. Es ist viel lesbarer und verständlicher. –

Antwort

1

Meine Frage ist, wie viele Artikel gibt es in data["response"]["docs"]? Gibt es genau 11? So oder so würde ich den folgenden Code verwenden statt:

<% data["response"]["docs"].each_with_index do |item, index| %> 
<%= index %> 
<br/> 
<%= item["topic"] %> 
<% end %> 

Diese iteriert über die data["response"]["docs"] egal wie viele es sind (ob ist 1 doc oder 20 docs) und speichert den Wert in der Variablen mit dem Namen item. Die each_with_index Funktion gibt Ihnen auch den Index, gespeichert in index, so dass Sie es später anzeigen können. Wenn Sie nur die ersten 11 verwenden möchten:

<% data["response"]["docs"].first(11).each_with_index do |item, index| %> 

Dies wird maximal 11 Doc-Elemente greifen.

+0

Es besteht aus Hunderten von Dokumenten, aber ich möchte nur die ersten 10 für Anfänger zeigen, und das funktioniert wie ein Charme! Ich wusste nicht, dass du die Schleife so erstellen kannst, danke! – Benny

0

Es ist schwer zu sagen, was falsch sein könnte gehen, weil Sie den Fehler nicht gebucht haben, aber wenn Sie ein 10-Element-Array verwenden, möchten Sie tun:

(0..9).each do |i|

Mit 0 Indizes sollten Sie nur den Bereich von 0-9 statt 0-10 verwenden. Möglicherweise erhalten Sie einen Fehler, weil Sie versuchen, auf ein Element zuzugreifen, das nicht vorhanden ist (z. B. bei Index 10).

Noch besser ist:

<% data["response"]["docs"].each do |document| %> 
<%= document["topic"] %> 
<% end %> 

oder wenn Sie den Index drucken müssen:

<% data["response"]["docs"].each_with_index do |document, index| %> 
<%= index %> <br/> 
<%= document["topic"] %> 
<% end %> 
+0

Es ist vorzuziehen, _nicht_ '' '' zu verwenden. Die 3-Punkt-Version ist schwieriger zu lesen und ist vielen Entwicklern unbekannt, was dazu führt, dass während der Wartung Fehler auftreten können. Es ist besser/idiomatisch, die 2-Punkt-Version, '..' zu verwenden, wobei die nachfolgende Zahl um 1 reduziert wird. –

+0

Interessant, ich fange stattdessen damit an. Danke Tin Man. Antwort wurde bearbeitet. – jktin12

+0

Betrachten Sie das auch: Es ist einfacher zu verstehen, wenn Sie '10.x tun | i |' als es ist '(0..9). Jedes tun | i |'. 'i' wird immer noch bei 0 beginnen und bis 9 zählen, aber es ist offensichtlicher, dass der Code 10 Mal wiederholt wird. –