【问题标题】:Splitting ruby content with in_groups_of使用 in_groups_of 拆分 ruby​​ 内容
【发布时间】:2016-01-18 16:01:10
【问题描述】:

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

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

【问题讨论】:

  • Enumerable#each_slice 将为您执行此操作,因为您使用 false 作为 fill_with 参数。例如page-articles.each_slice(3).with_index do |article,i|

标签: ruby each middleman


【解决方案1】:

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 时,它不再返回相等的组,而是将元素拆分为 n 个元素的组,当拆分不均匀时,最后一组将是剩余的元素,无论n.

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

这种不相等的分组功能实际上可以在不使用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​​ 核心的一部分。

【讨论】:

    【解决方案2】:

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

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

    require "active_support/core_ext/array"
    

    【讨论】:

    • 谢谢。我包含 gem,捆绑并显示数据错误。所以现在,问题是语法。 each_with_index 似乎与 in_groups_of 发生冲突
    • 在我的简单测试中,in_groups_of 似乎与each_with_index 配合得很好
    • #in_groups_offalse 作为 fill_with 参数似乎您可以只使用 Enumerable#each_slice 而无需额外的要求。例如a = (1..5).to_a; a.in_groups_of(2,false) == a.each_slice(2).to_a; #=&gt; true
    • 是的,你是对的。我想我需要先限定 unless 语句?那么我们就剩下一个可以操作的数组了吗?
    • @engineersmnky 你会添加作为答案吗?做到了。
    猜你喜欢
    • 2010-11-30
    • 2015-08-08
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多