Rails 3在循环内分配容器Div

时间:2012-06-11 16:46:27

标签: ruby-on-rails-3 loops html

说我正在遍历一系列产品,我将如何在该循环中分配容器div。例如,我想要输出如下:

<div class="page">
  <p>product1</p>
  <p>product2</p>
  <p>product3</p>
  <p>product4</p>
</div>
<div class="page">
  <p>product5</p>
  <p>product6</p>
  <p>product7</p>
  <p>product8</p>
</div>

我试过这样的事情:

<% @products.each_with_index do |product, index| %>
  <% if index%4 == 0 %>
    <div class="page">
  <%end%>
  <p><%= product.data %>
  <% if index%4 == 0 %>
    </div>>
  <%end%>
<% end %>

但正如预期的那样,它只能用容器包围每一个产品。我想我将需要两个循环才能使其正常工作,但是如何在不重复数据的情况下实现这一目标呢?

修改

当使用each_with_index的替代方法时,是否有办法使用此方法跟踪索引?还有一些基于索引值设置的条件属性。

例如:

style=<%= index == 0 ? "top:5px;" : ""%>

4 个答案:

答案 0 :(得分:3)

<% @products.each_slice(4) do |slice| %>
  <div class="page">
    <% slice.each do |product| %>
      <p><%= product.data %></p>
    <% end %>
  </div>
<% end %>

答案 1 :(得分:2)

另一种方法:

<% while group = @products.take 4 %>
  <div class="page">

  <% group.each do |product| %>
    <p><%= product.data %></p>
  <% end %>

  </div>
<% end %>

答案 2 :(得分:1)

<div class="page">

<% @products.each_with_index do |product, index| %>
    <p><% product.data %></p>

    <% if index % 4 == 3 %>
        </div><div class="page">
    <% end %>
<% end %>

</div>

(编辑:忘了我的结束标签!)

答案 3 :(得分:1)

将数组拆分为相同大小的组的Rails方法是ary.in_groups_of(number)

<% @products.in_groups_of(4, false) do |group| %>
  <div class="page">
    <% group.each do |product| %>
      <p><% product.data %></p>
    <% end %>
  </div>
<% end %>

Haml好多了:)

- @products.in_groups_of(4, false) do |group|
  .page
    - group.each do |product|
      %p= product.data

您可以使用@products.index(product)获取绝对产品索引,或使用

获取组索引
<% @products.in_groups_of(4, false).each_with_index do |group, group_index| %>