在每个块的Ruby中,如何对块内数组中的最后一条记录执行某些操作?

时间:2011-11-08 20:50:36

标签: ruby sinatra

说我有这样一个块:

<% @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 个答案:

答案 0 :(得分:7)

最干的方法是使用CSS代替。而不是例如这样:

li.last { color: red; }

..然后用额外的CSS类弄乱你的标记,只需使用:last-child伪选择器,即:

li:last-child { color: red; }

然后您不必在视图中更改任何内容。所有现代浏览器都支持此功能,包括IE9。

答案 1 :(得分:2)

尝试each_with_index

<% @help_sections.each do |section, index| %>
    <li <%= "class='last'" if index == (@help_sections.length-1) %>><%= section.name %></li>
<% end %>

答案 2 :(得分:1)

如果使用each_with_index而不是普通each,则该块也将传递集合中当前元素的索引。然后,您可以将其与@help_sections.length进行比较。

E.g。

<% @help_sections.each_with_index do |section, i| %>
    <li<% concat " class='last'" if i == @help_sections.length - 1 %>><%= section.name %></li>
<% end %>

答案 3 :(得分:1)

您可以执行类似

的操作
<% @help_sections.count.times do |i| %>
    <%= @help_sections[i].name %>
    <%= do_something if @help_sections.count == i - 1 %>
<% end %>

答案 4 :(得分:1)

这个旧答案可能会有所帮助(Tell the end of a .each loop in 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 %>

答案 5 :(得分:1)

在智能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

答案 6 :(得分:1)

DRY一般来说是一个好主意,但不要为了避免重复使用而自杀。

<% @help_sections[0...-1].each do |section| %>
    <li><%= section.name %></li>
<% end %>
<li class="last"><%= @help_sections.last.name %></li>