DEV Community

thomasvanholder
thomasvanholder

Posted on • Updated on

How to upgrade Rails 6.1 to Rails 7

  1. Update rails in gemfile
  2. Upgrade rails packages
  3. Add sprockets to gemfile
  4. Run update rails task
  5. Verify framework defaults
  6. Verify depreciated methods

How to upgrade an exising application to Rails 7. Note that Rails 7 requires Ruby 2.7.0 or newer.


1. Update rails in gemfile

# old
gem "rails", "~> 6.1.4"

# new
gem "rails", "~> 7.0.0"
Enter fullscreen mode Exit fullscreen mode

In the terminal run:

bundle update
Enter fullscreen mode Exit fullscreen mode

2. Upgrade rails packages

In the package.json file, find all @rails packages and upgrade then one by one. For example:

yarn upgrade @rails/actioncable --latest
yarn upgrade @rails/activestorage --latest
yarn upgrade @rails/request.js --latest
Enter fullscreen mode Exit fullscreen mode

3. Add sprockets to gemfile

When you are using the asset pipeline, assets related errors can pop up when running a rails command.
Example:

# - Don't know how to build task 'assets:precompile'
# - 'method_missing': undefined method `assets'
Enter fullscreen mode Exit fullscreen mode

Add sprockets to the gem file as it's now an optional depedency.

gem "sprockets-rails"
Enter fullscreen mode Exit fullscreen mode
bundle install
Enter fullscreen mode Exit fullscreen mode

4. Run update rails task

bin/rails app:update
Enter fullscreen mode Exit fullscreen mode

This will prompt you file by file to integrate the new rails 7 defaults.

Example:
Overwrite .../config/boot.rb? (enter "h" for help) [Ynaqdhm]
Note: press h to see the menu options.

Go through every file to inspect the difference between the default set-up of rails 7 and your current configuration.

You can open the files in your editor to compare when selecting merge (m). If you run into the following error:
Please specify merge tool to 'THOR_MERGE' env
Run the app:update command again with your editor specified.

For example (vs code)

THOR_MERGE=code bin/rails app:update
Enter fullscreen mode Exit fullscreen mode

After completing the set-up run rails db:migrate to migrate the newly added active storage migration file.

❗️ If you have set-up other environments, non-default enviroments, like staging.rb make sure to update that file too.


5. Verify framework defaults

After completing the bin/rails app:update from the step 4, Rails creates a new_framework_defaults_7.0.rb file in config/initializers. This file helps you to make a big upgrade a little easier by flipping on the new default settings one-by-one in multiple deployments.

The application.rb file's setting load_defaults specifies which rails version's default settings to load. This means you can temporarily utilize the default configuration settings from Rails 6.1 while running Rails 7.

# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.1
Enter fullscreen mode Exit fullscreen mode

Then, gradually turn on each setting and verify your application is still working as intended. Once you've switched on every setting, you can remove the new_framework_defaults_7.0.rb and flip the load_defaults version in application.rb to 7.0.

How to turn on Rails 7 framework defaults (part 1)

# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0
Enter fullscreen mode Exit fullscreen mode

6. Verify depreciated methods

Your application might use other depreciated features. Read through the Rails 6.1 to Rails 7 section to identify and fix any methods call or settings that are no longer supported.


Discussion (5)

Collapse
michellelwt profile image
Michelle Loh • Edited on

Consider this stackoverflow solution before the 5th step if you have some errors like:

PG::UndefinedTable: ERROR: relation "active_storage_blobs" does not exist
Enter fullscreen mode Exit fullscreen mode
Collapse
michellelwt profile image
Michelle Loh

Hey @thomasvanholder , I followed the steps in the post and I noticed that the package.json has no changes compared to those newly created rails 7 app, why is it like that? (Beginner learning ruby on rails)

Collapse
gisegalaburri profile image
Gisele Galaburri

I think the 5th step isn't necessary when you upgrade a recently created app.
I mean, you can load_defaults of rails 7.0 without problem

Collapse
pavelloz profile image
Paweł Kowalski

I think upgrading gem is only the beginning (1%?). The fun starts with updating application code.

Collapse
thomasvanholder profile image
thomasvanholder Author

Installing the gem is the easy part indeed!