2012-11-15 17 views
9

Ich habe eine Sammlung von Gegenständen ich mit einem Teil machen möge:Rails: Render-Sammlung Teil: Erste Größe Sammlung innerhalb Teil

@items = ['a','b','c'] 

<%= render :collection => @items, :partial => 'item' %> 

und ich mag die Elemente mit aufsteigenden Zahlen nummerieren. So soll die Ausgabe sein:

3: a 
2: b 
1: c 

Ich weiß, Schienen liefert einen Zähler in der teilweise, so dass, wenn ich die Elementen absteigend zur Nummer wollte, kann ich den folgenden Teil erstellen:

<%= item_counter %>: <%= item %> 

die gibt mir

1: a 
2: b 
3: c 

Aber für die aufsteigend Zahlen, ich brauche die Gesamtzahl o f Artikel, die ich mit einem lokalen Teil bieten könnte:

<%= render :collection => @items, :partial => 'item', :locals => {:total => @items.size} %> 

und dann im Teil:

<%= total - item_counter %>: <%= item %> 

Aber es fühlt sich für mich wie Wiederholung, weil die Methode macht bereits über die weiß Größe der Sammlung.

Gibt es wirklich keine Möglichkeit, die Gesamtzahl der Elemente einer Sammlung in einem Teil zu erhalten, außer mit einer lokalen Variablen?

+1

Nummer [Überzeugen Sie sich selbst] (https://github.com/rails/rails/blob/master/actionpack/lib/action_view/renderer/partial_renderer.rb) –

+0

sah ich dort, aber ich dachte, dass ich hat etwas gefehlt. –

Antwort

11

Das folgende ist möglich seit Rails Version 4.2:

Innerhalb des Teils Sie Zugriff auf eine Funktion/Variable collection_iteration genannt haben. Wenn Sie collection_iteration.size anrufen, erhalten Sie die Summe.

Vom changelog:

Die Iteration Objekt ist als die lokale Variable #{template_name}_iteration wenn partials mit Sammlungen zu machen.

Es Zugang zum size der Sammlung gibt iteriert werden, wobei die aktuellen index und zwei bequemen Methoden first? und last?.

+1

Nein, im Teil ist keine 'Sammlung' verfügbar. Zumindest nicht in Rails 3.2.6. Woher hast du diese Informationen? –

+0

Ich habe dies von der Quelle: https://github.com/rails/rails/blob/6b8dd70083d747535cc35dce176e5afb6ad98177/actionpack/lib/action_view/renderer/partial_renderer.rb#L220 – lucasuyezu

+0

Ich habe auch auf meine Arbeit Anwendung vor dem Posten der Antwort getestet. Ich könnte seine Rails-Version am Dienstag überprüfen, aber es funktioniert. – lucasuyezu

Verwandte Themen