В Ruby для каждого блока, как мне сделать что-то с последней записью в массиве в блоке? - PullRequest
0 голосов
/ 09 ноября 2011

Скажем, у меня есть такой блок:

<% @help_sections.each do |section| %>
    <li><%= section.name %></li>
<% end %>

Но на последней возвращенной записи я хочу сделать что-то еще, например, применить класс к li, который там есть:

<li class="last"><%= section.name %></li>

Как мне сделать это самым СУХИМ способом?

Спасибо.

Edit1:

Я полагаю, я бы просто использовал оператор if и метод last ruby, но не уверен, как это сделать в блоке?Я знаю, что если бы я просто хотел последний элемент в этом массиве, я мог бы просто сделать @help_sections.last, но это не имеет смысла в пределах блока Ruby.

Ответы [ 7 ]

7 голосов
/ 09 ноября 2011

Самый СУХОЙ способ - использовать CSS.Например, вместо этого:

li.last { color: red; }

.. и затем загромождая вашу разметку дополнительным классом CSS, просто используйте псевдоселектор :last-child, то есть:

li:last-child { color: red; }

Тогда вы нене нужно ничего менять по вашему мнению.Это поддерживается во всех современных браузерах, включая IE9.

2 голосов
/ 09 ноября 2011

Попробуйте each_with_index:

<% @help_sections.each do |section, index| %>
    <li <%= "class='last'" if index == (@help_sections.length-1) %>><%= section.name %></li>
<% end %>
1 голос
/ 09 ноября 2011

СУХОЙ - хорошая идея в целом, но не убивайте себя, чтобы не повторить li.

<% @help_sections[0...-1].each do |section| %>
    <li><%= section.name %></li>
<% end %>
<li class="last"><%= @help_sections.last.name %></li>
1 голос
/ 09 ноября 2011

В общих случаях, не охватываемых интеллектуальными селекторами CSS, вы можете определить удобный вспомогательный метод, который предоставит каждому повторяемому элементу его контекст в коллекции.Вот так:

def each_with_context enum
  length = enum.count
  enum.each_with_index do |elem, i|
    context = {
      :first => i == 0,
      :last => i == length - 1,
      :even => i.even?,
      :odd => i.odd?,
      :middle => i == length / 2
    }
    yield elem, context
  end
end

А затем используйте его в представлении HAML следующим образом:

-each_with_context(@help_sections) do |section, context|
  %li{:class => context[:last] ? 'last' : nil}
    =section.name
1 голос
/ 09 ноября 2011

Этот старый ответ может помочь ( Сообщите конец цикла .each в ruby ​​).В основном, вы можете использовать:

<% @help_sections.each_with_index do |section, index| %>
  <% if index == @help_sections.size - 1 %>
    <li class="last">
  <% else %>
    <li>
  <% end %>

  <%= section.name %></li>
<% end %>
1 голос
/ 09 ноября 2011

Вы можете сделать что-то вроде

<% @help_sections.count.times do |i| %>
    <%= @help_sections[i].name %>
    <%= do_something if @help_sections.count == i - 1 %>
<% end %>
1 голос
/ 09 ноября 2011

Если вы используете each_with_index вместо простого each, блоку также будет передан индекс текущего элемента в коллекции.Затем вы можете сравнить это с @help_sections.length.

Например

<% @help_sections.each_with_index do |section, i| %>
    <li<% concat " class='last'" if i == @help_sections.length - 1 %>><%= section.name %></li>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...