I’m trying to create a photo
factory that’s in a many to one
association
with gallery
. And I’m getting two errors, depending on how I specify
the
association between those two models.
Here’s the models:
Photo
belongs_to :gallery, class_name: “SevenGallery::Gallery”
Gallery
has_many :photos, class_name: “SevenGallery::Photo”, foreign_key:
“seven_gallery_gallery_id”, dependent: :destroy
And the migrations
create_table :seven_gallery_galleries do |t|
t.string :title
t.timestamps null: false
end
create_table :seven_gallery_photos do |t|
t.string :caption
t.string :image
t.references :seven_gallery_gallery, index: true
t.timestamps null: false
end
add_foreign_key :seven_gallery_photos, :seven_gallery_galleries,
on_delete: :cascade
Now Here’s my factories:
Gallery:
FactoryGirl.define do
factory :gallery, class: ‘SevenGallery::Gallery’ do
title “an event gallery”
factory :gallery_with_photos do
after(:build) do |gallery|
gallery.photos << FactoryGirl.create(:photo_one,
seven_gallery_gallery_id: gallery)
gallery.photos << FactoryGirl.create(:photo_two,
seven_gallery_gallery_id: gallery)
gallery.photos << FactoryGirl.create(:photo_three,
seven_gallery_gallery_id: gallery)
end
end
end
end
And Photo:
FactoryGirl.define do
factory :photo, class: “SevenGallery::Photo” do
factory :photo_one do
end
factory :photo_two do
end
factory :photo_three do
end
factory :photo_with_gallery do
gallery
end
end
end
And here’s the controller spec that generates the error:
it “changes is_main to true in self and false in rest” do
photo_one = FactoryGirl.create(:photo_with_gallery)
expect(photo_one.gallery).to be_a SevenGallery::Gallery
end
Whenever I run the test I get this error:
Failure/Error: photo_one = FactoryGirl.create(:photo_with_gallery)
ActiveModel::MissingAttributeError:
can’t write unknown attribute gallery_id
# ./spec/controllers/seven_gallery/photos_controller_spec.rb:
When I change the association part to be:
factory :photo_with_gallery do
association :gallery, factory: gallery
end
I get this error:
Failure/Error: photo_one = FactoryGirl.create(:photo_with_gallery)
NoMethodError:
undefined method `name’ for :photo_with_gallery:Symbol
# ./spec/controllers/seven_gallery/photos_controller_spec.rb:8
Backtrace:
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute.rb:138:in
with_value_from_database' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute_set.rb:39:in
write_from_user’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute_methods/write.rb:74:in
write_attribute_with_type_cast' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute_methods/write.rb:56:in
write_attribute’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute_methods/dirty.rb:96:in
write_attribute' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/attribute_methods.rb:373:in
[]=’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/associations/belongs_to_association.rb:83:in
replace_keys' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/associations/belongs_to_association.rb:14:in
replace’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/associations/singular_association.rb:17:in
writer' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.1/lib/active_record/associations/builder/association.rb:123:in
gallery=’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:16:in
public_send' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:16:in
block (2 levels) in object’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:15:in
each' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:15:in
block in object’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:14:in
tap' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/attribute_assigner.rb:14:in
object’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/evaluation.rb:12:in
object' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/strategy/create.rb:9:in
result’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/factory.rb:42:in
run' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:23:in
block in run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.1/lib/active_support/notifications.rb:166:in
instrument' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/factory_runner.rb:22:in
run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/strategy_syntax_method_registrar.rb:20:in
block in define_singular_strategy_method' # ./spec/controllers/seven_gallery/photos_controller_spec.rb:8:in
block (3 levels) in module:SevenGallery’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:177:in
instance_exec' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:177:in
block in run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:385:in
block in with_around_and_singleton_context_hooks' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:343:in
block in with_around_example_hooks’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:474:in
block in run' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:614:in
block in run_around_example_hooks_for’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-rails-3.2.1/lib/rspec/rails/example/controller_example_group.rb:179:in
block (2 levels) in <module:ControllerExampleGroup>' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:333:in
instance_exec’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:333:in
instance_exec' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:387:in
execute_with’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:616:in
block (2 levels) in run_around_example_hooks_for' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-rails-3.2.1/lib/rspec/rails/adapters.rb:113:in
block (2 levels) in module:MinitestLifecycleAdapter’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:333:in
instance_exec' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:333:in
instance_exec’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:387:in
execute_with' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:616:in
block (2 levels) in run_around_example_hooks_for’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:247:in
call’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:617:in
run_around_example_hooks_for' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/hooks.rb:474:in
run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:343:in
with_around_example_hooks' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:385:in
with_around_and_singleton_context_hooks’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example.rb:174:in
run' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:549:in
block in run_examples’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:545:in
map' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:545:in
run_examples’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:512:in
run' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:513:in
block in run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:513:in
map' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/example_group.rb:513:in
run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:110:in
block (3 levels) in run_specs' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:110:in
map’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:110:in
block (2 levels) in run_specs' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1526:in
with_suite_hooks’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:109:in
block in run_specs' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/reporter.rb:62:in
report’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:108:in
run_specs' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:86:in
run’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:70:in
run' # /home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:38:in
invoke’
#
/home/rafael/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/exe/rspec:4:in
<top (required)>' # /home/rafael/.rbenv/versions/2.2.0/bin/rspec:23:in
load’
# /home/rafael/.rbenv/versions/2.2.0/bin/rspec:23:in `’
Any help would ne appreciated. Thanks.