1

假设我正在遍历一系列产品,我将如何在该循环中分配一个容器 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 %>

但正如预期的那样,它只会用容器围绕每 4 个产品。我在想我需要两个循环才能使它工作,但是我怎样才能在不复制数据的情况下做到这一点?

编辑

当使用 each_with_index 的替代品时,有没有办法使用这种方法来跟踪索引?还有一些基于索引值设置的条件属性。

例如:

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

4 回答 4

3
<% @products.each_slice(4) do |slice| %>
  <div class="page">
    <% slice.each do |product| %>
      <p><%= product.data %></p>
    <% end %>
  </div>
<% end %>
于 2012-06-11T16:56:50.753 回答
2

另一种方法:

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

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

  </div>
<% end %>
于 2012-06-11T16:59:35.843 回答
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>

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

于 2012-06-11T16:51:56.740 回答
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| %>
于 2012-06-11T16:58:56.430 回答