说我有这样一个块:
<% @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块的范围内没有意义。
答案 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>