Ruby:循环遍历哈希并检查是否存在密钥以确定要显示的标记和数据

时间:2012-05-31 03:36:00

标签: ruby haml

这是我第一次使用Ruby,所以我可能会错误地接近它。

我正在尝试通过哈希来显示它的内容。当我浏览哈希时,我需要测试一个密钥是否存在,比如城市。如果城市不存在,那么它不应该显示地址。这是我开始构建哈希的地方:

# app.rb
set :haml, :format => :html5
get "/" do
    @users = Hash[
                  [["name", "bill"], ["city", "nyc"],  ["address", "street"]],
                  [["name", "ted"], ["city", "denver"]],
                  [["name", "sam"], ["address", "road"]]
                 ]
    haml :index
end

这就是我循环哈希的方式:

# layout.haml
- @users.each do |user|
    - user.each do |u|
        - u.each do |b|
            = b

一旦我到达b,它将显示所有内容,如:

["name", "bill"]
["city", "nyc"]
["address", "street"]
["name", "ted"]
["city", "denver"]

在循环中,如何显示名称以及检查每个用户是否存在地址以确定是否应显示城市以及可能需要添加的任何标记?理想情况下它会显示如下:

<p>bill, <span class="address">nyc, street</span></p>
<p>ted</p>
<p>sam, <span class="address">road</span></p>

我是否正确地创建了Hash以便这样做?

1 个答案:

答案 0 :(得分:3)

不是你想在哈希中使用嵌套的数组做什么,而是让一个包含user哈希的数组更好:

@users = [
           { :name => 'bill', :city => 'city', :address => 'street' },
           { :name => 'ted', :city => 'denver' },
           { :name => 'sam', :address => 'road' }
         ]

有了这个,你可以这样做:

- @users.each do |user|
    = user[:name]
    - if user.has_key?(:address) && user.has_key?(:city)
        = "#{user[:address]}, #{user[:city]}"
    - elsif user.has_key?(:address)
        = "#{user[:address]}"