Warning in Rails Console Factory Bot Doesn't Seem to reload! Correctly
source link: https://fuzzyblog.io/blog/rails/2022/06/08/warning-in-rails-console-factory-bot-doesn-t-seem-to-reload-correctly.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Warning in Rails Console Factory Bot Doesn't Seem to reload! Correctly
Jun 8, 2022
I'm actively engaged in greenfield development once again and I'm learning / relearning things that I likely have known in the past. I don't know if this is a known issue, a bug or maybe a design choice. Either way, I found it useful to know this so I thought it was useful to document it.
I spend a lot of time in rails console (thank you Jared for beating this into me a thousand, thousand years ago; hope you are well) and reload! normally works pretty damn well but this one caught me hard. Take a look at this back trace
link = FactoryBot::create(:link)
TRANSACTION (0.1ms) BEGIN
Account Create (0.2ms) INSERT INTO "accounts" ("email", "status", "role") VALUES ($1, $2, $3) RETURNING "id" [["email", "[email protected]"], ["status", "verified"], ["role", "customer"]]
Account::PasswordHash Create (0.2ms) INSERT INTO "account_password_hashes" ("id", "password_hash") VALUES ($1, $2) RETURNING "id" [["id", 63], ["password_hash", "[FILTERED]"]]
TRANSACTION (0.5ms) COMMIT
/Users/sjohnson/.rvm/gems/ruby-3.0.0/gems/activemodel-7.0.3/lib/active_model/attribute_methods.rb:458:in `method_missing': undefined method `account=' for #<Link id: nil, created_at: nil, updated_at: nil, date_created_at: nil, account_id: nil, team_id: nil, link_type_id: nil, active: true, url: "https://www.example.com/", name: "Cartazzi App on development", project_id: nil, code_environment_id: nil> (NoMethodError)
Did you mean? account_id=
3.0.0 :014 > reload!
Reloading...
true
3.0.0 :015 > link = FactoryBot::create(:link)
TRANSACTION (0.1ms) BEGIN
Account Create (0.3ms) INSERT INTO "accounts" ("email", "status", "role") VALUES ($1, $2, $3) RETURNING "id" [["email", "[email protected]"], ["status", "verified"], ["role", "customer"]]
Account::PasswordHash Create (0.3ms) INSERT INTO "account_password_hashes" ("id", "password_hash") VALUES ($1, $2) RETURNING "id" [["id", 64], ["password_hash", "[FILTERED]"]]
TRANSACTION (0.5ms) COMMIT
/Users/sjohnson/.rvm/gems/ruby-3.0.0/gems/activemodel-7.0.3/lib/active_model/attribute_methods.rb:458:in `method_missing': undefined method `account=' for #<Link id: nil, created_at: nil, updated_at: nil, date_created_at: nil, account_id: nil, team_id: nil, link_type_id: nil, active: true, url: "https://www.example.com/", name: "Cartazzi App on development", project_id: nil, code_environment_id: nil> (NoMethodError)
Did you mean? account_id=
3.0.0 :016 > quit
cartazzi on main [!🤷] via v18.2.0 via 💎 v3.0.0 on ☁️ (us-west-2) took 9m51s
❯ RAILS_ENV=test bundle exec rails c
Loading test environment (Rails 7.0.3)
3.0.0 :001 > link = FactoryBot::create(:link)
TRANSACTION (0.2ms) BEGIN
Account Create (1.7ms) INSERT INTO "accounts" ("email", "status", "role") VALUES ($1, $2, $3) RETURNING "id" [["email", "[email protected]"], ["status", "verified"], ["role", "customer"]]
Account::PasswordHash Create (0.8ms) INSERT INTO "account_password_hashes" ("id", "password_hash") VALUES ($1, $2) RETURNING "id" [["id", 65], ["password_hash", "[FILTERED]"]]
TRANSACTION (1.8ms) COMMIT
/Users/sjohnson/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Account can't be blank (ActiveRecord::RecordInvalid)
Note: All of this was done in test mode on rails console or:
RAILS_ENV=test bundle exec rails c
Here is what's going on:
- I start by trying to create a FactoryBot object which had an error.
- I made some changes in the class (not shown; offscreen).
- I did a reload!
- I tested again – failure.
- Step #2 all over again.
- I started to think that maybe I needed to exit – that reload! wasn't working.
- I exited and MAGIC – it worked
Sidebar: FactoryBot method missing errors
The error above was that I was missing the belongs_to block in my model:
belongs_to :account
belongs_to :project
belongs_to :team
belongs_to :link_type
I suspect this is a pretty common error when starting a new project.
Posted In: #rails #ruby #FactoryBot
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK