1

我有两个模型:

class Product < ActiveRecord::Base
  attr_accessible :amount, :name, :unit, :description, :stock, :limit
  has_many :cart_rows
  has_one :inquery
end

class Inquery < ActiveRecord::Base
  attr_accessible :product, :text, :phone, :zip, :product_id, :state, :street, :city
  belongs_to :product
end

在我的查询索引视图中,我有:

<% @inqueries.each do |inquery| %>
  <%= inquery.product.name %>
  <%= inquery.text %>
<% end %>

我收到以下错误:undefined method 'name' for nil:NilClass

我究竟做错了什么?行为是否has_one不同于has_many?

4

3 回答 3

2

不,你应该可以打电话inquery.product。您可能有一个没有产品的查询。

在控制台 ( rails c) 中,运行: Inquery.where(product_id: nil),看看你是否得到结果。

您应该在 Inquery 模型中验证产品的存在:

validates :product, presence: true
于 2012-08-17T15:14:05.227 回答
2

您有一个未附加产品的 Inquery。

当您调用时,inquery.product您将返回一个 nil 值,然后当您调用.name该 nil 值时,您会收到错误消息。这与 has_one 或 has_many 无关

于 2012-08-17T15:14:06.757 回答
1

我根据您在此处描述的信息构建了一个应用程序,并且能够通过使用带有 nil 产品值(也适用于文本)的 Inquery 记录来重现您的问题。您可能希望添加更好的验证器,以便无法保存带有 nil 的查询。

这是我的 rails 控制台会话中的粘贴:

  Inquery Load (0.1ms)  SELECT "inqueries".* FROM "inqueries" 
#<Inquery:0x00000002c03e40>
 => [#<Inquery id: 1, text: nil, phone: nil, zip: nil, product_id: nil, state: nil, street: nil, city: nil, created_at: "2012-08-17 15:23:49", updated_at: "2012-08-17 15:23:49">] 

1.9.3p194 :002 > Inquery.all.each { |n| puts n.product.name }
  Inquery Load (0.2ms)  SELECT "inqueries".* FROM "inqueries" 
NoMethodError: undefined method `name' for nil:NilClass

顺便说一句,现在提供一些不请自来的建议:与关键字“文本”同名的字段是一个非常糟糕的主意。你今天可能不会在脚下开枪,但在某个时候你会。考虑将文本字段重命名为 usertext 或 description 或类似的东西。

于 2012-08-17T15:28:36.090 回答