2017-08-07 45 views
0

我有一個事件對象數組。每個事件都有一個稱爲位置的散列,其中包含名稱,地址,州,城市,郵政編碼等。但是,並非所有地點都有這些密鑰。我只想顯示鍵的值,如果他們在那裏。這裏是我的代碼只顯示紅寶石散列表中的值

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{event.location[:name]}, #{event.location[:address]}, #{event.location[:city]}, #{event.location[:state]}, #{event.location[:zipcode]}" 
    end 
end 

這工作正常,如果我有一個完整的地址。但是,如果我的位置只是名字會顯示這樣的

Location: Central Park, , , , 

如何才能擺脫這些多餘的逗號?有時可能是2或3個尾隨逗號。我知道如何擺脫一個,但如果沒有設置尾隨逗號的數量,我不知道如何去做。希望將位置信息顯示在一行上。

任何幫助,將不勝感激。

回答

5

我會做這樣的事情:

@events.each do |event| 
    values = event.location.values_at(:name, :address, :city, :state, :zipcode).compact 
    puts "Location: #{values.join(', ')}" unless values.empty? 
end 

或者您可能想要將方法添加到您的Event類中。

def stringified_location 
    values = location.values_at(:name, :address, :city, :state, :zipcode).compact 
    values.join(', ') unless values.empty? 
end 

,並調用它是這樣的:

@events.each do |event| 
    stringified_location = event.stringified_location 
    puts "Location: #{stringified_location}") if stringified_location 
end 
+3

......並且讓「事件」類的責任也應該考慮。 –

+0

這是完美的。非常感謝!! –

0

你可以抓住與.values哈希值,然後將它們用.join(", ")適當的分隔符組合成一個字符串:

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{event.location.values.join(", ")}" 
    end 
end 
+2

可能是值不符合要求的順序。 – Stefan

+0

@Stefan你說的沒錯,當斯皮克曼打我時,我正在努力改進我的答案。 Upvoting他! – eiko

0

你可以只創建一個數組中的值,然後加入他們的行列:

@events.each do |event| 
    if !event.location.empty? 
    puts "Location: #{[event.location[:name], event.location[:address], event.location[:city]}, event.location[:state], event.location[:zipcode]].compact.join(', ')}" 
    end 
end 
+1

啊,我不知道緊湊,認爲,應該有一個更優雅的解決方案:-) –

0

一種可能性就是把價值一個數組然後加入它們。

@events.each do |event| 
    if !event.location.empty? 
    location = [event.location[:name], event.location[:address], event.location[:city], event.location[:state], event.location[:zipcode]] 
    location -= [nil] #remove empty elements 
    puts "Location: #{location.join(', ')}" 
    end 
end