2014-03-03 64 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?)