【问题标题】:Undefined Method for Nil even after a conditional即使在有条件的情况下,Nil 的未定义方法
【发布时间】:2015-09-16 21:54:27
【问题描述】:

我有一个名为@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 时,条件被忽略并且&lt;%= order.foo %&gt; 抛出undefined method [foo] for nil class。这是因为:eventseager_loaded(预加载)吗?如果是这样,最佳解决方案是什么?

【问题讨论】:

  • 它会在event.foo 上引发异常,但不会在event.has_orders? 上引发异常
  • @eirikir 是的。 has_orders? 通过。我正在为.orders.each 进行另一次迭代,此时异常被抛出
  • 但是如果eventnil 在任何一种情况下都会引发它......错误中“未定义”的方法是什么?
  • 是的,我的错。我应该提到另一个迭代。编辑了问题。
  • has_orders? 是如何定义的?如果您将其替换为 event.orders.present? 会怎样?

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


【解决方案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>'

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

为了避免错误,你可以写:

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

【讨论】:

  • mmmaan,我一直在生产中检查has_orders?,但从未真正检查过foo,它是nil 的订单之一。谢谢!
猜你喜欢
  • 2023-02-14
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多