Upgrade to Rails 8
Rails 8 is a recommended upgrade for apps already on Rails 7. The headline changes are the database-backed Solid adapters (Queue/Cache/Cable), Kamal 2 deploys, Propshaft as the default asset pipeline, and a built-in authentication generator. Because upgrades touch the database and deploy stack, treat this as a high-risk change.
Last verified · Updated May 22, 2026
Rails 8 is a recommended upgrade for apps already on Rails 7. Most work is in adopting the new defaults — Solid Queue/Cache/Cable, Propshaft, Kamal 2 — and walking config.load_defaults to 8.0. Budget one to five days depending on your asset pipeline and deploy setup, and treat it as high-risk because it touches the database and infrastructure.
Who should upgrade
- Apps on Rails 7 wanting to drop Redis for the database-backed Solid adapters.
- Teams adopting Kamal 2 for container deploys or Thruster for asset acceleration.
- Apps on Rails 6 should first reach Rails 7, then 8 — never skip a major.
Who should wait
- Apps with a critical gem that has no Rails 8-compatible release yet.
- Apps mid-migration off Webpacker that should finish that move on Rails 7 first.
What changed
- Solid Queue, Solid Cache, and Solid Cable: database-backed adapters that replace Redis for jobs, caching, and Action Cable.
- Kamal 2 is the default deploy tooling, with Thruster fronting Puma for HTTP/2 and asset caching.
- Propshaft is the default asset pipeline, replacing Sprockets for new apps.
- A built-in authentication generator scaffolds sessions and password reset without a gem.
- SQLite is now production-ready for many workloads thanks to tuned defaults.
Unlike a frontend library bump, a Rails upgrade can change job, cache, and cable backends and may require migrations. Run it on a release branch against a copy of production data, and never run pending migrations without explicit sign-off.
Recommended upgrade path
# 1. Bump the rails gem in the Gemfile, then:$ bundle update rails# 2. Run the interactive update task and review every config diff$ bin/rails app:update# 3. Boot + test before advancing defaults$ bin/rails runner 'puts Rails.version' && bin/rails testAdvancing framework defaults
# config/application.rb — advance ONE minor at a time, only after the suite is green
module MyApp
class Application < Rails::Application
# was: config.load_defaults 7.2
config.load_defaults 8.0
end
endVersion support matrix
| Version | Status | Released | Notes |
|---|---|---|---|
| 6.x | EOL | 2019-08-16 | Upgrade off urgently — no security fixes |
| 7.x | Maintenance | 2021-12-15 | Security and bug fixes only |
| 8.x | Active (current) | 2024-11-07 | Solid adapters, Kamal 2, Propshaft |
Upgrade this app to Rails 8. First inspect for blocking gems (bundle outdated), the current config.load_defaults value, and the asset pipeline in use. Then bump the rails gem, run `bundle update rails`, run `bin/rails app:update` and review each config diff, fix boot/autoload errors, and only after tests pass advance config.load_defaults to 8.0 and fix the deprecations it surfaces. Run `bin/rails test` after each step and report before continuing. Never run pending database migrations without confirmation.
Safety: Incremental edits only. Pause for review after app:update and before advancing config.load_defaults. Database migrations require explicit human sign-off.
PR review checklist
- rails and ruby versions are pinned and Gemfile.lock is committed
- Every bin/rails app:update config diff was reviewed, not blindly accepted
- config.load_defaults was advanced only after the suite went green
- Job, cache, and cable adapters are explicitly configured (Solid or existing)
- Pending database migrations are reviewed and reversible
Rollback strategy
- Keep the gem bump, app:update diffs, fixes, and the load_defaults change in separate commits.
- Revert the Gemfile to the prior rails version and run `bundle install` if a blocking incompatibility appears.
- Hold the upgrade behind a release branch until the full suite and a staging deploy are green.
- Back up the database before any migration so you can restore on rollback.
Common errors
- NameError/LoadError at boot — a file or constant name Zeitwerk rejects (carried over from the 7 upgrade).
- Jobs silently not processing after the queue adapter default changed — set the adapter explicitly.
- Asset 404s after the Propshaft switch — confirm the manifest and precompile step.
Related migration paths
Official sources
Backs the breaking-change and migration-step claims.
Backs the breaking-change and migration-step claims.
Backs the breaking-change and migration-step claims.
Frequently asked questions
Is Rails 8 a hard upgrade?
For modern Rails 7 apps the framework changes are manageable, but the upgrade is high-risk because it can touch your job/cache/cable backends, asset pipeline, and deploy tooling. The effort scales with how much custom infrastructure you have and whether you adopt the new Solid adapters and Kamal 2.
Do I have to adopt the Solid adapters and Kamal 2?
No. Solid Queue/Cache/Cable, Kamal 2, and Propshaft are the new defaults for fresh apps but are opt-in for existing ones. You can upgrade to Rails 8 while keeping your current Redis, Sidekiq, Sprockets, and deploy setup, then migrate infrastructure separately.