2014-03-03 86 views
0

我有散列的數組:@grouped_messages =如何在存在空白散列時迭代散列數組?

[{}, 
{100=>[#<Message id: 3, content: "Needs more training", from: 100, employee_id: 1>]}, 
{101=>[#<Message id: 2, content: "Very lazy.", from: 101, employee_id: 2>], 102=>[#<Message id: 1, content: "Fantastic.", from: 102, employee_id: 2>]}] 

其中一個散列是空白的。

我如何通過數組迭代,而不會引起以下錯誤顯示的內容:

Error (undefined method `any?' for nil:NilClass) 

我曾嘗試以下,但我仍然得到錯誤:

<% if @grouped_messages.any? %> 
<% @grouped_messages.each do |sender, messages| %> 
    <% if messages.any? %> 
    <% messages.each do |msg| %> 
     .... 
    <% end %> 
    <% end %> 
    <% end %> 
<% end %> 
+0

創建時,'你應該刪除空哈希@ grouped_messages'在你的控制器中 – Stefan

+0

可以使用'next'跳過你不想迭代的東西。 – juanitofatas

回答

0

試試這個:

<% @grouped_messages.reject(&:blank?).each do |sender, messages| %> 
    <% messages.each do |msg| %> 
    # .... 
    <% end %> 
<% end %> 
+1

在if語句中使用空Hash會產生'true':'{}? 「true」:「false」#=>「true」'。據我所知,只有「無」和「假」纔會產生錯誤。 –

3

我會過濾僅保留非空的哈希值:

@grouped_messages.reject(&:blank?).each ... 
+0

它會給錯誤,像未定義的方法'空白'? for {...}:散列 –

+3

@AlokAnand不,主動支持提供此方法 – apneadiving

0

刪除的條件

if messages.any? 

和下一行更改爲

messages.to_a.each do |msg| 
... 
1

可以過濾掉空哈希像apneadiving建議。但是,您的代碼中存在另一個錯誤。

@grouped_messages是一個哈希數組。你不能這樣做

@grouped_messages.each do |sender, messages| 

使用.each上的陣列產生一個單個值,在你的情況,這是一個哈希。所以,你應該做的:

@grouped_messages.each do |grouped_message| 
    grouped_message.each do |sender, messages| 
    # ... 
    end 
end 

在你的情況,你的messages變量始終是nil,作爲散列(例如,{100=>[ ... ]})將被存儲在sender變量。因此,即使使用非空哈希,它也是nil

實際上,在查看您的數據時,最好使@grouped_messages代替Hash,並使用發件人ID和密鑰作爲消息列表。所以有這樣的結構:

@grouped_messages = { 
    101 => [ msg1, msg2, ... msgN ], 
    102 => [ msg1, msg2, ... msgN ] 
} 

然後,你可以做你的循環就好了:

@grouped_messages.each do |sender, messages| 
    # ...  
end 
0

刪除空消息以純Ruby

@grouped_messages.reject(&:empty?)