【问题标题】:Rails 3 Assign A Container Div Within LoopRails 3在循环内分配容器div
【发布时间】:2012-06-11 16:46:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    <% @products.each_slice(4) do |slice| %>
      <div class="page">
        <% slice.each do |product| %>
          <p><%= product.data %></p>
        <% end %>
      </div>
    <% end %>
    

    【讨论】:

    【解决方案2】:

    另一种方法:

    <% while group = @products.take 4 %>
      <div class="page">
    
      <% group.each do |product| %>
        <p><%= product.data %></p>
      <% end %>
    
      </div>
    <% end %>
    

    【讨论】:

      【解决方案3】:

      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| %>
      

      【讨论】:

      • 查看编辑详情。我也同意 HAML 看起来更好看,但遗憾的是,我 95% 的应用程序是使用 ERB 编写的,除非我将所有现有视图都更改为 HAML,否则启动并开始使用其他东西可能是个坏主意。
      • 添加了获取绝对索引的注释。
      • 太好了,我不知道绝对索引。但是,我不认为我们可以让它为页面容器工作?例如,我想仅将样式应用于第一页容器。
      • 通过group_index 工作(见答案)。第一组是0,第二组是1,依此类推。
      • 太棒了,它现在可以工作了,这个答案比我使用 orzechowskid 的答案要干净一些,所以我会接受这个。
      【解决方案4】:
      <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>
      

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

      【讨论】:

      • 啊哈,我知道有办法做到这一点。顺便说一句,4 == 3 部分很好,我一定一直在考虑 Java 语法
      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2017-04-04
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多