2011-11-22 50 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