用 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 分组功能实际上可以在不使用 activesupport
到 Enumberable#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 核心的一部分。
我正在使用中间人的博客在页面上输出所有博客文章的摘要,如下所示:
<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 分组功能实际上可以在不使用 activesupport
到 Enumberable#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 核心的一部分。