2011-11-22 48 views
2

我如何可以顯示一個物體成果轉化列如下所示:如何使用Rails 3將數據劃分爲列?

<ul> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
</ul> 
<ul> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
</ul> 
<ul> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
    <li><a href="#">Category name</a></li> 
</ul> 

不管結果返回給@categories = Category.all我想將其分成三列這樣的。 以編程方式執行此操作的最佳方式是什麼?

回答

8

each_slice方法可以幫助你

%w(a s d f g h).each_slice(3) {|x| p x} 
["a", "s", "d"] 
["f", "g", "h"] 

在HAML,您可以用這種方式處理它

- cats = Array.new(3, []) 
    = @categories.each_slice(3) do |category| 
    - cats = cats.zip(category).map(&:flatten) 
    - cats.each do |subcat| 
    %ul 
     - subcat.each do |l| 
     %li 
      %a{:href => "#"} 
      = l 
+0

+1向我介紹這一點。我不知道它存在! – sosborn

+0

確實不錯!但是,如果返回的元素數量不是9(並且在3中不能很好地劃分)。如何讓第一列需要額外的1? – user1049097

+0

你將不得不有一個迭代遍歷返回的數組並寫入ul/li元素,在這種情況下'x' – cmwright

8

Rails有一個專門的辦法做到這一點使用in_groups

<% @categories.in_groups(3, false) do |group| %> 
<ul> 
    <% group.each do |category| %> 
    <li><%= category.name %></li> 
    <% end %> 
</ul> 
<% end %> 

in_groups的第二個參數(在此ca中爲false se)表示如果@ categories.size不是3的倍數,則此代碼不會生成空列表項。

+0

真的很有用,謝謝 – cmwright