Rails 部分破解:每个部分传递 2 条记录?或者更好的主意?

Rails partial hacking: pass 2 records per partial? Or a better idea?

我正在创建用于打印标签的视图。我 HTML'd / CSS'd a table 具有正确尺寸的 2 列 5 个标签:

<div id="inventory_labels">
  <table class="table-bordered" id="avery8163">
    <thead>
      <tr>
        <td style='width: .155in;'></td>
        <td style='width: 4in;'></td>
        <td style='width: .19in;'></td>
        <td style='width: 4in;'></td>
        <td style='width: .155in;'></td>
      </tr>
    </thead>
    <tfoot>
      <tr>
        <td colspan="5"></td>
      </tr>
    </tfoot>
    <tbody>
      <% 40.times do # just a placeholder for the actual loop / partial %>
        <tr>
          <td></td>
          <td>LABEL #1 (should be a record)</td>
          <td></td>
          <td>LABEL #2 (should be a record)</td>
          <td></td>
        </tr>
      <% end %>
    </tbody>
  </table>
</div>

和 SCSS:

#inventory_labels {
  width: 8.5in;
  margin-right: auto;
  margin-left: auto;
}

table#avery8163 {
  table-layout: fixed;
  width: 8.5in;

  thead, tfoot {
    td {
      height: .5in;
    }
  }

  tbody {
    td {
      height: 2in;
    }
  }
}

@media print {
  table#avery8163 {
    thead { 
      display: table-header-group;
    }

    tfoot { 
      display: table-footer-group;
    }
  }
}

我想使用局部循环遍历 <tbody> 中的记录,但我需要一次循环 2 个,每个 "LABEL".

有什么建议或想法吗?

我确实尝试过将其格式化为 div(如来自黑暗时代的 this strategy)而不是 table 列,但数学变得非常混乱,因为页边距和装订线不对齐好起来。

第一个运行

这真的很丑吧?

@counts是我要循环的ActiveRecord记录数组,在控制器中定义。

<tbody>
  <% n = 0 %>
  <% @loop.times do # @loop = (@counts.count/2).ceil %>
    <tr>
      <td></td>
      <td>
        <%= render partial: 'label', locals: { count: @counts[n] } %>
        <% n += 1 %>
      </td>
      <td></td>
      <td>
        <% if @counts[n].present? %>
          <%= render partial: 'label', locals: { count: @counts[n] } %>
        <% end %>
        <% n += 1 %>
      </td>
      <td></td>
    </tr>

  <% end %>
</tbody>

看到把你的集合当数组使用没问题,可以用in_groups_of方法https://api.rubyonrails.org/classes/Array.html#method-i-in_groups_of

<% @objects.in_groups_of(2, false) do |obj1, obj2| %>
  <tr>
    <td></td>
    <td><%= #something with obj1 %></td>
    <td></td>
    <td><%= #something with obj2, you should check if it's not nil though if the array has an odd length %></td>
    <td</td>
  </tr>
<% end %>