web-dev-qa-db-fra.com

ActiveModel :: MissingAttributeError: impossible d'écrire l'attribut inconnu `ad_id 'avec FactoryGirl

J'ai les modèles suivants:

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

Et j'ai défini les usines suivantes:

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

Quand j'essaye de faire ça:

ad = FactoryGirl.create (: ad) J'obtiens l'erreur suivante ActiveModel::MissingAttributeError: can't write unknown attribute ad_id' en plein dans la ligne où je décide de l'association d'images dans ad Factory.

Qu'est-ce que je fais mal ici?

27
Hommer Smith

Quand tu dis:

has_one :image

Rails s'attend à ce que vous définissiez un ad_id champ dans la table images. Compte tenu de l'organisation de vos associations, je suppose que vous disposez d'un image_id et un logo_id dans la table ads donc au lieu de:

class Ad < ActiveRecord::Base
  belongs_to :page

  has_one :image
  has_one :logo
end

Vous voulez probablement dire:

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

Si ce n'est pas le cas, vous devez ajouter ad_id colonnes vers Image et Logo.

41
Maurício Linhares

J'ai rencontré cette même erreur et il a fallu un certain temps pour trouver un correctif. Juste au cas où cela aiderait quelqu'un d'autre à l'avenir, voici mon scénario et ce qui a fonctionné pour moi. Les noms de classe ont été modifiés car c'est pour le travail:

J'avais 2 modèles avec espace de noms:

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

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

Quand je créais un nouveau pot avec de nouvelles collations, j'obtenais:

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

Le correctif consistait à modifier le has_many pour être plus explicite sur la clé étrangère:

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