thoughtbot--factory_bot/lib/factory_bot/strategy
Daniel Colson 5a3247dd8c Avoid stubbing id for records without primary key
Fixes #1305

Before Rails 6 when the build_stubbed strategy assigned an id on a
record without a primary key column, the `id=` method would no-op, and
the record would end up looking like a new_record (i.e. `new_record?`
would return true because the id was nil).

This problem surfaced because of a [change in Rails 6][rails], which
caused `id=` to raise a potentially confusing
`ActiveModel::MissingAttributeError: can't write unknown attribute ''`
for records without a primary key column.

Since build_stubbed stubbed was calling `id=` for all instances,
regardless of whether they had primary keys, it was raising the above
error.

To avoid this error, we check whether the instance has a primary_key
defined before setting the id.

We also changed `persisted?` and `new_record?` to be less dependent on
the id. That way those methods will work as expected for records without
primary keys.

[rails]: b6828fc915

Co-authored-by: Jesse Bailey <jbailey117@gmail.com>
2019-07-19 15:18:11 -04:00
..
attributes_for.rb Replace 'girl' with 'bot' everywhere (#1051) 2017-10-20 15:20:28 -04:00
build.rb Replace 'girl' with 'bot' everywhere (#1051) 2017-10-20 15:20:28 -04:00
create.rb Replace 'girl' with 'bot' everywhere (#1051) 2017-10-20 15:20:28 -04:00
null.rb [Rubocop] Style Cop Offenses (#1208) 2018-10-07 18:02:54 -04:00
stub.rb Avoid stubbing id for records without primary key 2019-07-19 15:18:11 -04:00