每3个项目新增一行

jQn*_*oob 13 ruby ruby-on-rails

我想一次渲染我的项目列表3,以便它们以三行的形式输出.我目前正在使用

<div class="row">
  <div class="three columns">
 <% @items.each do |f|%>
   <div class="item">
     <%= f.content %>
       </div>
     <% end %>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

哪个输出所有规则在一个'行' -

<div class="row">
  <div class="three columns">
   <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是为返回的每三个项输出一行,所以 -

<div class="row">
  <div class="three columns">
   <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
  </div>
</div>
<div class="row">
  <div class="three columns">
   <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
       <div class="item">
     This is the content
       </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

谢谢

Cad*_*ade 40

除了前面提到的each_slice,Rails还有一个in_groups_of方法,你可以这样使用:

<% @items.in_groups_of(3, false).each do |group| %>
  <div class="row">
    <div class="three columns">
      <% group.each do |item| %>
        <div class="item">
          <%= item.content %>
        </div>
      <% end %>
    </div>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

几乎相同each_slice,除了需要输出空白div的场景变得更加清晰如此:

<% @items.in_groups_of(3).each do |group| %>
  <div class="row">
    <div class="three columns">
      <% group.each do |item| %>
        <div class="item">
          <%= item.content if item %>
        </div>
      <% end %>
    </div>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

in_groups_of垫缺少在最后一组项目进行nil默认,所以它发出的最后几个迭代和if item检查将确保它不会通过调用炸毁contentnil.

in_groups 是另一个用于视图格式的有趣的.


MrY*_*iji 11

您可以使用each_slice方法:

<% @items.each_slice(3) do |array_of_3_items|%>
  <div class="row">
    <div class="three columns">
      <% array_of_3_items.each do |item|%>
        <div class="item">
          <%= item.content %>
        </div>
      <% end %>
    </div>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

附加说明:如果你想要最后一行3个div,即使最后一行只包含2个项目怎么办?(即@items是5个项目的列表,最后一行应该只输出2个div).

解决方案:

<% @items.each_slice(3) do |array_of_3_items|%>
  <div class="row">
    <div class="three columns">
      <% array_of_3_items.each do |item|%>
        <div class="item">
          <%= item.content %>
        </div>
      <% end %>
      <% (3 - array_of_3_items.length).times.each do |fake_div| %>
        <div class="item empty">
        </div>
      <% end %>
    </div>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)