2012-05-31 1 views
2

Ruby를 처음 사용하기 때문에이를 잘못 접근 할 수 있습니다.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> 

해시를 제대로 만들면 어떻게됩니까? 대신 당신이 user 해시 포함하는 배열을 가지고, 더 나은 것 해시 내부 중첩 배열으로 무엇을하려고의

답변

3

: 그와

@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]}" 
+1

이 문제를 해결해야했습니다. 3 행에서 마지막 has_key는'(: city)'이어야하고'[: city] '가 아니어야합니다. 도움을 주셔서 감사합니다. – superboringusername

+0

그래, 그건 실수 였어. – Mischa

관련 문제