当有空白哈希时如何迭代哈希数组?

时间:2014-03-03 13:23:12

标签: ruby-on-rails ruby

我有一系列哈希:@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 %>

5 个答案:

答案 0 :(得分:3)

我过滤只保留非空哈希:

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

答案 1 :(得分: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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

删除条件

if messages.any?

并将下一行更改为

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

答案 4 :(得分:0)

使用纯Ruby删除空消息

@grouped_messages.reject(&:empty?)