ActiveModel :: MissingAttributeError:无法使用FactoryGirl编写未知属性“ad_id”

时间:2013-11-30 02:08:36

标签: ruby-on-rails factory-bot

我有以下型号:

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'

我在这里做错了什么?

4 个答案:

答案 0 :(得分:40)

当你说:

has_one :image

Rails希望您在ad_id表中定义images字段。鉴于您的关联的组织方式,我假设您有一个image_id和一个logo_id 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_idImage添加Logo列。

答案 1 :(得分:1)

检查您的测试数据库。

就我而言,有时在错误迁移后修改开发数据库后,我并没有修改测试数据库中的列。

答案 2 :(得分:0)

我遇到了同样的错误,花了一段时间才找出解决办法。以防万一这对以后的人有所帮助,这是我的情况以及对我有用的。类名已更改,因为这是为了工作:

我有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

答案 3 :(得分:0)

如果您在运行规范时遇到此错误,则可能是新添加的字段未在测试环境中迁移。所以用下面的命令在测试环境中迁移它

rake db:migrate db:test:prepare
相关问题