即使在有条件之后,Nil 的未定义方法

Undefined Method for Nil even after a conditional

我有一个名为 @events 的变量,它是 Listings .where(category: 'Tickets') 的集合。事件 (:events) 来自 User 模型 eager_loaded。在我看来我有:

<% for event in @events do %>
  <% if event.has_orders? %>
    ...
    <% orders.each do |order| %>
      <%= order.foo %>
    <% end %>
    ...
  <% else %>
    ...
  <% end %>
<% end %>

一切都在开发中工作,但在生产中却不行。当我在我的视图中遍历 @events 时,条件被忽略并且 <%= order.foo %> 抛出 undefined method [foo] for nil class。发生这种情况是因为 :eventseager_loaded(预加载)吗?如果是这样,最佳解决方案是什么?

Everything works in development, but not in production

听起来您的数据已更改。什么改变了?看看这个:

class Order
  def foo
    puts 'hello'
  end
end

order = Order.new
order.foo


orders = [
  nil,
  nil,
  nil,
]

orders.each do |order|
  order.foo
end

--output:--
hello
1.rb:18:in `block in <main>': undefined method `foo' for nil:NilClass (NoMethodError)
    from 1.rb:17:in `each'
    from 1.rb:17:in `<main>'

orders数组存在,但报错和你一样。换句话说,您的 Event 可以通过 has_orders? 测试,但您仍然会遇到该错误。您需要弄清楚为什么用 nil 值填充事件的订单数组。

为避免错误,您可以写:

  orders.each do |order|
    order.foo if order
  end