即使在有条件的情况下,Nil的未定义方法也是如此

时间:2015-09-16 21:54:28

标签: ruby-on-rails ruby activerecord eager-loading

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

<% 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(预加载)吗?如果是这样,最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

  

一切都在开发中,但不在生产中

听起来你的数据发生了变化。改变了什么?看看这个:

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>'

订单数组存在,但错误与您的错误相同。换句话说,您的Event可以通过has_orders?测试,但您仍然可以获得该错误。您需要弄清楚为什么使用nil值填充事件的orders数组。

为避免错误,您可以写:

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