我有一系列哈希:@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 :(得分: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?)