2

Ruby を扱うのはこれが初めてなので、間違ったアプローチをしている可能性があります。

ハッシュを調べて内容を表示しようとしています。ハッシュを調べているときに、city などのキーが存在するかどうかをテストする必要があります。都市が存在しない場合、住所は表示されません。これは、ハッシュの構築を開始した場所です。

# 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>

この方法でハッシュを適切に作成していますか?

4

1 に答える 1

4

ハッシュ内のネストされた配列で実行しようとしていることの代わりに、ハッシュを含む配列を用意することをお勧めし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]}"
于 2012-05-31T03:51:40.163 に答える