2016-01-18 2 views
0

Я использую блог посреднического, чтобы вывести сводку всех сообщений в блоге на странице так:Расщепления с 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> 

Из исследований, кажется, что Руби 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'. Кроме того, похоже, что если логика не будет применяться до того, как она будет разбита на группы по три. Любые мысли о способах улучшить это?

+0

['Enumerable # each_slice'] (http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-each_slice) сделает это за вас, так как вы используете' false' as аргумент 'fill_with'. например 'page-articles.each_slice (3) .with_index do | article, i |' – engineersmnky

ответ

0

Array#in_groups_of является activesupport расширения добавлено Rails, чтобы позволить вам разделить и доступ равных группы (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]] 

Это неравная функциональность группировки фактически доступна без использования 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 вам -ный функциональности Дон не нужно было бы рекомендовать использовать 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 является частью рубинового ядра.

0

Array#in_groups_of не входит в состав ядра Ruby, но добавлен Rails как часть активных расширений Core активной поддержки.

Вы можете использовать расширения Active Support, требуя его.

require "active_support/core_ext/array" 
+0

Спасибо. Я включил драгоценный камень, связал и показал ошибку данных. Итак, проблема заключается в синтаксисе. Кажется, что каждый_with_index сталкивается с in_groups_of – JCHASE11

+0

В моем простом тесте 'in_groups_of', кажется, отлично работает с' each_with_index' –

+1

'# in_groups_of' с' false', поскольку аргумент 'fill_with' кажется, что вы можете просто использовать' Enumerable # each_slice' без необходимости в дополнительном требовании. например 'a = (1..5). to_a; a.in_groups_of (2, false) == a.each_slice (2) .to_a; # => true' – engineersmnky