用 in_groups_of 拆分 ruby 内容

Splitting ruby content with in_groups_of

我正在使用中间人的博客在页面上输出所有博客文章的摘要,如下所示:

<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'。此外,在将其分成三组之前,似乎应该应用 unless 逻辑。有什么改进方法的想法吗?

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

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

require "active_support/core_ext/array"

Array#in_groups_of 是由 Rails 添加的 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) 作为 false 传递时,它不再 returns 相等的组,而是将元素分成 n 个元素的组,并且当分割不均匀时最后一组将是剩余的元素,与 n 无关。

require "active_support/core_ext/array"
a = (1..5).to_a
a.in_groups_of(2,false) 
#=> [[1,2],[3,4],[5]]

这个 non-equal 分组功能实际上可以在不使用 activesupportEnumberable#each_slice

的情况下使用
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-ing 功能,您不需要我建议使用 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>

这将按要求运行而无需任何额外开销,因为 Enumerable 是 ruby 核心的一部分。