遍历数组并列出除一个项目之外的所有项目

时间:2014-01-20 05:46:13

标签: ruby activerecord sinatra erb

我想列出一系列项目,但我想排除一个名为“提示”的特定项目。我想的是“除非item.name =='tip'”,但不确定在哪里放置类似的东西

<ul>
  <% @order.each do |item| %>
    <li><h2><%= item["quantity"] %> &times; <%= item["name"] %></h2></li>
  <% end %>
</ul>

2 个答案:

答案 0 :(得分:1)

unless .. end放入<% .. %>

<ul>
  <% @order.each do |item|
       unless item['name'] == 'tip' %>
    <li><h2><%= item["quantity"] %> &times; <%= item["name"] %></h2></li>
  <%   end
     end %>
</ul>

示例(为简洁起见,使用item['name']代替item.name):

require 'erb'

class Listing
  def build
    @order = [
      {'quantity' => 1, 'name' => 'a'},
      {'quantity' => 2, 'name' => 'tip'},
      {'quantity' => 3, 'name' => 'c'},
    ]

    template = ERB.new <<-TMPL
    <ul>
      <% @order.each do |item|
           unless item['name'] == 'tip'%>
        <li><h2><%= item["quantity"] %> &times; <%= item["name"] %></h2></li>
      <%   end
         end %>
    </ul>
    TMPL
    template.result binding
  end
end

puts Listing.new.build

输出:

<ul>

    <li><h2>1 &times; a</h2></li>

    <li><h2>3 &times; c</h2></li>

</ul>

答案 1 :(得分:0)

实现目标有很多可能性。我建议使用next关键字,因为它使您能够忘记后一个代码中的情况,而且它不需要包含end关键字(当您在条件下有更多代码行时,它很快就会很难看出unless … end子句开始/结束的位置:

<ul>
  <% @order.each do |item|
       next if item["name"] == 'tip' %>
    <li><h2><%= item["quantity"] %> &times; <%= item["name"] %></h2></li>
  <% end %>
</ul>
相关问题