Supposant votre modèle est appelé Event
et il a un attribut date
, et votre collection de ces derniers est appelé @events
, voici une idée: mettre ceci dans votre vue .. .
<ul>
<%= render @events, locals: { events: @events } %>
</ul>
... vous auriez alors un appelé partielle _event.html.erb
qui ressemble à ceci:
<% last_event = event_counter == 0 ? nil : events[event_counter - 1]
next_event = events[event_counter + 1]
%>
<% if last_event && last_event.date != event.date
# add a new date header and start a new nested list of events
%>
<li><h3><%= event.date %></h3>
<ul>
<% end %>
<li><%= link_to event %></li>
<% if next_event && next_event.date != event.date
# end the nested list and make way for the next date header and set of events
%>
</ul>
</li>
<% end %>
Qu'est-ce happing est dans l'appel render
nous transmettons dans toute la collection @events
comme local appelé events
. Ensuite, à l'intérieur du partiel, nous utilisons la méthode event_counter
générée automatiquement pour rechercher les événements précédents (events[event_counter - 1]
) et suivants (events[event_counter + 1]
) dans la collection.Ensuite, si la date du event
actuel est différente de la date de last_event
(ce qui signifie que c'est le premier pour cette date), nous commençons un nouvel ensemble avec une nouvelle date, et si la date de event
est différente de la date de next_event
(c'est à dire le dernier pour cette date) nous terminons l'ensemble.
C'est un peu moche, et il y a des façons plus élégantes de le faire à coup sûr, mais cela fait l'affaire.