使用in_groups_of拆分ruby内容

时间:2016-01-18 16:01:11

标签: ruby each middleman

我正在使用中间人的博客在页面上输出所有博客帖子的摘要:

<ul> 
  <% page_articles.each_with_index do |article, i| %>
    <% unless article.data['tags'].include?('featured') %>
      <li class="Project">
        <h3><%= link_to article.title, article.url %></h3>
      </li>
    <% end %>
  <% end %>
</ul>

这很好用,但我需要在3个条目之后打破这样:

<ul>
   <li class="Project"><li>
   <li class="Project"><li>
   <li class="Project"><li>
</ul>

<div class="break"></div>

<ul>
   <li class="Project"><li>
   <li class="Project"><li>
   <li class="Project"><li>
</ul>

从研究来看,似乎ruby的in_groups_of似乎是这里的方式,但无法使语法正常工作。这就是我所拥有的:

<ul> 
<% page_articles.in_groups_of(3, false).each_with_index do |article, i| %>
  <% unless article.data['tags'].include?('featured') %>
    <li class="Project">
      <h3><%= link_to article.title, article.url %></h3>
    </li>
  <% end %>
<% end %>
</ul>

它返回undefined method 'in_groups_of'。此外,似乎除非在将逻辑分成三个一组之前应该应用逻辑。有关如何改善这一点的想法吗?

2 个答案:

答案 0 :(得分:1)

Array#in_groups_of是Rails添加的A B C D E F G H扩展程序,允许您拆分和访问具有固定数量元素的相等组(activesupport)(默认情况下Array将填补不均匀的分裂。例如

nil

当您将第二个参数(require "active_support/core_ext/array" a = (1..5).to_a a.in_groups_of(2) #=> [[1,2],[3,4],[5,nil]] )作为fill_with传递时,它不再返回相等的组,而是将元素拆分为n个元素的组,当拆分不均匀时,最后一个组将是剩下的元素,无论n。

false

这种不相等的分组功能实际上无需使用require "active_support/core_ext/array" a = (1..5).to_a a.in_groups_of(2,false) #=> [[1,2],[3,4],[5]] Enumberable#each_slice

activesupport

由于在这种情况下您将第二个参数指定为a = (1..5).to_a a.each_slice(2).to_a #=> [[1,2],[3,4],[5]] require "active_support/core_ext/array" a.in_groups_of(2,false) == a.each_slice(2).to_a #=> true 而不是false - 您不需要的功能我建议使用require,如下所示:

Enumerable#each_slice

由于<ul> <% page_articles.each_slice(3).with_index do |article, i| %> <% unless article.data['tags'].include?('featured') %> <li class="Project"> <h3><%= link_to article.title, article.url %></h3> </li> <% end %> <% end %> </ul> 是ruby核心的一部分,因此无需任何额外开销即可正常运行。

答案 1 :(得分:0)

Array#in_groups_of不是核心Ruby的一部分,但是作为Active Support Core扩展的一部分由Rails添加。

您可以通过要求使用Active Support扩展程序。

require "active_support/core_ext/array"