【问题标题】:"undefined method `name' for nil:NilClass" when creating new instance创建新实例时“nil:NilClass 的未定义方法‘名称’”
【发布时间】:2010-11-22 16:54:05
【问题描述】:

我在 Rails 中遇到问题,我在两个模型(订单和状态)之间存在基本的多对多关系。这些模型如下所示:

class Order < ActiveRecord::Base
  has_many :products, :through => :lines
  has_and_belongs_to_many :statuses

  default_scope order("#{table_name}.created_at desc")
end

class Status < ActiveRecord::Base
  has_and_belongs_to_many :orders

end

在我的订单索引视图中,我显示了订单的最新状态,因此 order.statuses.last.name,但是,当我创建一个新订单时,我收到一个错误。此错误是针对未定义的方法名称,因为新订单在首次创建时没有任何关系。

我的问题是,有没有办法在保存新订单之前初始化我的两个模型之间的关系?我希望我的订单至少始终在我的状态集合中具有第一个状态,但不希望在保存之前必须手动检查它。

良好措施的错误是:

undefined method `name' for nil:NilClass

在我看来这一行:

<td><%= order.statuses.last.name %></td>

谢谢大家。

【问题讨论】:

  • 好吧,为了初始化statuses,您要么必须对其进行硬编码,要么访问数据库。那么为什么不直接保存然后继续呢?除非您缓存状态数组并以这种方式初始化您的订单。

标签: ruby-on-rails many-to-many associations relationship


【解决方案1】:

一个简单的修复:

<td><%= order.statuses.last.name if order.statuses %></td>

【讨论】:

  • 谢谢马克。解决这个问题,因为我的某些情况有混合的结果。我能够成功地做到以下几点: - 但我不能做到 。我的猜测是,这是因为 .name 方法来自我的状态模型,如果它是 nil,它仍然不知道如何响应?我想我必须在保存这个 .name 方法之前初始化一个关系才能被识别?再次非常感谢您,我真的很感谢您的帮助。
  • 所以一个状态可以没有名字而存在?在这种情况下,您可能希望将其包含在您的条件中:order.statuses.last.name if order.statuses.last.name
【解决方案2】:

如果没有最后一个状态或最后一个状态没有名称,这应该注意

<td><%= order.statuses.last.try(:name) %></td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多