web-dev-qa-db-ja.com

ActiveModel :: MissingAttributeError:FactoryGirlで不明な属性「ad_id」を書き込めません

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

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end

class Page < ActiveRecord::Base
  has_many :logos
  has_many :images
  has_many :ads
end

class Image < ActiveRecord::Base
  belongs_to :page
  has_many :ads
end

そして、私は次の工場を定義しました:

factory :page do
  url 'test.com'
end

factory :image do
  width 200
  height 200
  page
end

factory :ad do
  background 'rgb(255,0,0)'
  page
  image
end

私がこれをしようとすると:

ad = FactoryGirl.create(:ad)次のエラーが表示されますActiveModel::MissingAttributeError: can't write unknown attribute ad_id'広告ファクトリーで画像の関連付けを決定する行の右。

ここで何が間違っていますか?

27
Hommer Smith

あなたが言う時:

has_one :image

Railsは、imagesテーブルでad_idフィールドを定義することを期待しています。アソシエーションの編成方法を考えると、次の代わりにimage_idlogo_id a adsテーブルがあると仮定します。

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end

あなたはおそらく意味する:

class Ad < ActiveRecord::Base
  belongs_to :page
  belongs_to :image
  belongs_to :logo
end

そうでない場合は、ad_id列をImageLogoの両方に追加する必要があります。

41

私はこの同じエラーに遭遇し、修正を見つけるのに時間がかかりました。将来これが他の誰かを助ける場合に備えて、ここに私のシナリオと私のために働いたものがあります。これは作業用であるため、クラス名が変更されました。

2つの名前空間モデルがありました。

Pantry::Jar
has_many :snacks, class_name: Pantry::Snack
accepts_nested_attributes_for :snacks

Pantry::Snack
belongs_to :pantry_jar, class_name: Pantry::Jar

新しいスナックで新しい瓶を作成すると、次のようになります:

ActiveModel::MissingAttributeError: can't write unknown attribute `jar_id'

修正は、has_manyを変更して、外部キーについてより明示的にすることでした。

has_many :snacks, class_name: Pantry::Snack, foreign_key: :pantry_jar_id
1
evan