2012-07-26 63 views
0

我試圖渲染大量的三行內容。但是,我不確定如何確定使用Ruby的元素的當前位置。這是我有:確定Array.each中元素的索引

<% Animals.each do | animal | %> 
    <%= animal.species %> 
<% end %> 

我希望能夠添加<BR>或者,如果我是渲染每次表</TR><TR>我們就命中三分動物的集合。當然,如果元素數量nE不能被3整除,那麼該表格會變得格格不入。我想通過在迭代之後做一些檢查,我可以關閉它。

但是有沒有辦法獲得在Array.each方法中迭代的元素的索引?我有強烈的預感,我可能只是做到以下幾點:

<table> 
<% Animals.each do | animal | %> 
<% if Animals.find_index(animal)/3 == 0 %> 
    <tr> 
<% end %> 
     <td><%= animal.species %></td> 
<% if Animals.find_index(animal)/3 == 2 %> 
    </tr> 
<% end %> 
</table> 

我的唯一的事情就是AnimalActiveRecord::Base一個子類,所以我不知道(沒有看過,看),如果這將縮減好吧,更不用說,如果每個電話find_index將是一個超強的方法。歡迎任何建議。

+1

'Array#each_with_index' – 2012-07-26 18:02:46

+0

我正在使用Ruby 1.9.3,並且根據http://apidock.com/ruby/Enumerable/Enumerator/each_with_index該方法在該版本中不可用。 但是,這將完成這項工作! – jackyalcine 2012-07-26 18:10:46

+1

該方法可用。它只是[移動](http://apidock.com/ruby/Enumerable/each_with_index)到Enumerable的不同部分,由於'Array'從它繼承,該方法仍可用於'Array'。 – 2012-07-26 18:19:39

回答

4

你需要

<% animals = Animals.all %> 
<table> 
<% animals.in_groups_of(3) do |animal_row| %> 
    <tr> 
    <% animal_row.compact.each do |animal| %> 
     <td><%= render animal %></td> 
    <% end %> 
    </tr> 
<% end %> 
</table> 

大致應該做的工作。

更重要的是,我認爲保持Enumerable模塊的文檔非常適合作爲Ruby開發人員。這是我最喜歡的模塊,幾乎總是能幫助我輕鬆解決棘手的問題。

+0

談談快速回復!謝謝! – jackyalcine 2012-07-26 18:09:27

+1

注意我在內部循環中如何使用compact。關鍵是,最後一組3不能包含3個元素(當總元素不能被3整除時)。最後一組用nil填充並壓縮最後發送的節省你的nil錯誤。 – 2012-07-26 18:15:38

+0

我想問爲什麼,但後來你讀了我的心!再次感謝您:D – jackyalcine 2012-07-26 18:16:22