Ruby on Rails 8 has arrived, bringing exciting new features, performance improvements, and developer-friendly enhancements. Whether you're upgrading from Rails 7 or starting a new project, Rails 8 continues to streamline web development with its convention-over-configuration philosophy while embracing modern best practices.
In this blog post, we'll explore the key features of Rails 8 with practical examples to help you get the most out of this release.
1. Turbo as the Default Frontend Solution
Rails 8 fully embraces Hotwire (Turbo + Stimulus) as the default frontend approach, reducing JavaScript complexity while maintaining dynamic interactivity.
Example: Real-Time Updates with Turbo Streams
<!-- app/views/posts/index.html.erb -->
<%= turbo_stream_from "posts" %>
<div id="posts">
<%= render @posts %>
</div>
<!-- app/views/posts/_post.html.erb -->
<%= turbo_frame_tag dom_id(post) do %>
<h2><%= post.title %></h2>
<p><%= post.body %></p>
<% end %>
Now, any changes to posts (via CRUD operations) automatically update the DOM without full-page reloads.
2. Improved ActiveRecord Async Queries
Rails 8 enhances asynchronous query handling, making it easier to optimize database performance.
Example: Automatic Async Loading
# Rails 7 (explicit async)
posts = Post.where(published: true).load_async
# Rails 8 (implicit async when possible)
posts = Post.where(published: true) # Automatically async under the hood
This reduces boilerplate and improves scalability for I/O-bound applications.
3. Better Multi-Database Support
Rails 8 refines multi-database configurations, making it easier to scale reads and writes across different databases.
Example: Automatic Read Replicas
# config/database.yml
production:
primary:
database: app_prod
replica:
database: app_prod_replica
replica: true
# Models automatically use replicas for reads
User.all # Uses replica if available
User.create!(name: "Alice") # Uses primary DB
4. Enhanced Security with ActiveRecord Encryption
Rails 8 expands on deterministic and non-deterministic encryption for better security while maintaining queryability.
Example: Encrypted Attributes
class User < ApplicationRecord
encrypts :email, deterministic: true # Allows searching
encrypts :ssn, deterministic: false # Fully randomized
end
# Querying still works for deterministic fields
user = User.find_by(email: "user@example.com")
5. Simpler Background Jobs with Solid Queue
Rails 8 introduces Solid Queue, a new built-in database-backed job queue, as an alternative to Active Job adapters like Sidekiq.
Example: Enqueuing Jobs
# config/application.rb
config.active_job.queue_adapter = :solid_queue
# Enqueue a job
UserReportJob.perform_later(user_id: 1)
No need for Redis—just PostgreSQL or MySQL!
6. Improved Error Pages & Debugging
Rails 8 introduces better error pages with:
- Enhanced stack traces
- Code suggestions
- Integrated documentation links
No more guessing—just faster debugging!
7. Built-In Health Checks
Rails 8 adds standardized health check endpoints for monitoring and Kubernetes readiness.
Example: Adding a Health Route
# config/routes.rb
Rails.application.routes.draw do
get "/up", to: ->(env) { [200, {}, ["OK"]] }
end
8. Modern Asset Management with Import Maps by Default
Rails 8 continues promoting import maps for JavaScript dependency management without bundlers.
Example: Adding a JS Library
# config/importmap.rb
pin "lodash", to: "https://ga.jspm.io/npm:lodash@4.17.21/lodash.js"
No Webpack or Node.js required!
9. Improved Mailer Previews & Testing
Mailer previews now support better organization and dynamic data.
Example: Dynamic Mailer Previews
# test/mailers/previews/user_mailer_preview.rb
class UserMailerPreview < ActionMailer::Preview
def welcome_email
UserMailer.with(user: User.first || User.new(name: "Test")).welcome_email
end
end
10. Faster Development with Zeitwerk Autoloader Optimizations
Rails 8 further optimizes Zeitwerk, reducing reload times in development.
Upgrading to Rails 8
To upgrade:
- Update your Gemfile:
gem "rails", "~> 8.0.0"
- Run:
bundle update rails
rails app:update
Final Thoughts
Rails 8 continues to refine the developer experience with:
✅ Turbo-first frontends (less JavaScript)
✅ Better async & database scaling
✅ Stronger security & encryption
✅ Simpler background jobs (Solid Queue)
✅ Improved debugging & monitoring
Whether building a new app or upgrading, Rails 8 keeps Ruby on Rails fast, secure, and productive.
What’s your favorite Rails 8 feature? Let me know in the comments! 🚀
Top comments (0)