1

私は2つのモデルを持っています:

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値が返され、次にnil値を呼び出すと.name、エラーが発生します。これはhas_oneまたはhas_manyとは何の関係もありません

于 2012-08-17T15:14:06.757 に答える
1

ここで説明した情報に基づいてアプリを作成し、製品(テキストも)の値がnilのInqueryレコードを作成することで、問題を再現することができました。nilsを含む照会を保存できないように、より優れたバリデーターを追加することをお勧めします。

これが私の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 に答える