Как обернуть каждые N элементов в родительский div в ERB (Rails)?

Моя индексная страница участников - это просто список участников, но я бы хотел, чтобы каждые 3 участника были заключены в содержащий div (который будет действовать как строка). Итак, вместо:

<div class="member"></div>
<div class="member"></div>
<div class="member"></div>
<div class="member"></div>
<div class="member"></div>

Мне нужна разметка:

<div class="row">
  <div class="member"></div>
  <div class="member"></div>
  <div class="member"></div>
</div>
<div class="row">
  <div class="member"></div>
  <div class="member"></div>
</div>

У меня есть решение, но я им не доволен. Я действительно видел лучший способ сделать это в ERB раньше, но не могу найти его снова.

Мой текущий код:

<div class="row">
  <% @members.each do |member| %>
    <div class="member"><%=member.name%></div>
    <%= cycle("", "", "</div><div class=\"row\">".html_safe) %>
  <% end %>
</div>

person tybro0103    schedule 20.07.2012    source источник


Ответы (3)


Как насчет этого:

<% @members.each_slice(3) do |slice| %>
  <div class="row">
    <% slice.each do |member| %>
      <div class="member">
      ...your markup here
      </div>
    <% end %>
  </div>
<% end %>
person HargrimmTheBleak    schedule 20.07.2012
comment
Вы также можете заменить each_slice(3) на in_groups_of(3,false) - person Ben Miller; 20.07.2012
comment
in_groups_of у меня не сработало. этот ответ each_slice сэкономил мне время. - person Srikanth Jeeva; 24.05.2017

Я нашел метод, который искал. По сути, оно идентично each_slice(), опубликованному @HargrimmTheBleak, но имеет более понятное имя:

in_groups_of()

person tybro0103    schedule 20.08.2012

Звучит как отличный шанс использовать модуль

<div class="row">
<% for(i=1, i<[email protected], i++ %>
    <% if i%4 == 0 %>
        </div>
        <div class="row">
    <% end %>
    <div class="member"><%=@members[i-1]%></div>
<% end %>
</div>
person lightswitch05    schedule 20.07.2012
comment
Это даже сложнее, чем помощник cycle(). Я ищу что-нибудь попроще. - person tybro0103; 20.07.2012