我有两种模式:
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视图索引中,我有:
<% @inqueries.each do |inquery| %>
<%= inquery.product.name %>
<%= inquery.text %>
<% end %>
我收到以下错误:undefined method 'name' for nil:NilClass
我做错了什么? has_one
的行为与has_many
的行为不同吗?
答案 0 :(得分:2)
不,您应该可以致电inquery.product
。你可能有一个没有产品的问题。
在控制台(rails c
)中,运行:Inquery.where(product_id: nil)
,看看是否有结果。
您应该在Inquery模型中验证产品的存在:
validates :product, presence: true
答案 1 :(得分:2)
您有一个没有附加产品的Inquery。
当您致电inquery.product
时,您将返回一个零值,然后当您在零值上调用.name
时,您将收到错误消息。这与has_one或has_many
答案 2 :(得分:1)
我根据您在此处描述的信息构建了一个应用程序,并且能够通过具有产品的nil值的Inquery记录(也用于文本)来重现您的问题。您可能希望添加更好的验证器,以便无法保存带有nils的Inqueries。
以下是我的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
顺便说一句,现在对于一些未经请求的建议:与关键字“text”同名的字段是一个非常糟糕的主意。今天你可能不会用脚射击自己,但是你会在某个时候。考虑将文本字段重命名为usertext或description或类似的内容。