ActiveModel::MissingAttributeError: can't write unknown attribute `ad_id' with FactoryGirl

Hommer Smith picture Hommer Smith · Nov 30, 2013 · Viewed 48.1k times · Source

I have the following models:

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

And I have defined the following Factories:

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

When I try to do this:

ad = FactoryGirl.create(:ad) I get the following error ActiveModel::MissingAttributeError: can't write unknown attribute ad_id' right in the line where I decide the image association in the ad Factory.

What am I doing wrong here?

Answer

Maur&#237;cio Linhares picture Maurício Linhares · Nov 30, 2013

When you say:

has_one :image

Rails expects you to define an ad_id field at the images table. Given the way your associations are organised, I assume you have an image_id and a logo_id a the ads table so instead of:

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end

You probably mean:

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

If that's not the case then you need to add ad_id columns to both Image and Logo.