Ruby on Rails 8: Nieuwe Functies en Migratiehandleiding 2026
Rails 8 introduceert de Solid Trifecta, native authenticatie, Kamal 2 en Propshaft. Uitgebreide handleiding met codevoorbeelden en migratiestappen vanaf Rails 7.

Ruby on Rails 8 vormt het meest ingrijpende release sinds Rails 7 en vervangt externe afhankelijkheden die jarenlang de productie-architectuur van Rails-applicaties hebben bepaald. Redis, Sprockets en Capistrano worden optioneel dankzij ingebouwde alternatieven die rechtstreeks op de database draaien. Sinds de publicatie in november 2024 en de uitbreiding met Rails 8.1 in oktober 2025 biedt het framework een aanzienlijk vereenvoudigde infrastructuur. Voor ontwikkelteams in de Benelux en het bredere Nederlandstalige gebied betekent dit lagere operationele kosten, minder bewegende onderdelen in productie en een lagere instapdrempel voor middelgrote projecten.
Rails 8 vervangt Redis door de Solid Trifecta (Solid Queue, Solid Cache, Solid Cable), bevat een native authenticatiegenerator, maakt Propshaft de standaard asset-pipeline en levert Kamal 2 voor zero-downtime deployments. Ruby 3.2 of hoger is vereist.
De Solid Trifecta: infrastructuur op databaseniveau
Voor Rails 8 was vrijwel elke serieuze productieapplicatie afhankelijk van Redis voor drie kritieke functies: achtergrondtaken, caching en WebSocket pub/sub. De Solid Trifecta vervangt deze drie bouwstenen door adapters die compatibel zijn met PostgreSQL, MySQL en SQLite, aangestuurd door de bestaande relationele database.
Het operationele voordeel is direct merkbaar: geen aparte Redis-instantie meer om in te richten, te bewaken en te onderhouden. De afweging betreft ruwe prestaties. Redis blijft sneller in scenario's met extreem hoge doorvoer, maar voor het overgrote deel van de applicaties bieden de database-adapters ruim voldoende prestaties. Basecamp, de vlaggenschipapplicatie van 37signals, draait een Solid Cache van 10 TB in productie met een retentieperiode van 60 dagen.
Solid Queue: achtergrondtaken zonder Redis
Solid Queue vervangt Sidekiq, Resque of Delayed Job als Active Job-backend op databaseniveau. Het maakt gebruik van FOR UPDATE SKIP LOCKED op PostgreSQL 9.5+ en MySQL 8.0+, met een terugvalmechanisme voor SQLite.
# config/environments/production.rb
config.active_job.queue_adapter = :solid_queue
# config/solid_queue.yml
production:
dispatchers:
- polling_interval: 1
batch_size: 500
workers:
- queues: "*"
threads: 5
processes: 2
polling_interval: 0.1De Puma-plugin start Solid Queue samen met de webserver in de ontwikkelomgeving, waardoor een apart proces overbodig wordt:
# config/puma.rb
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] || Rails.env.development?Solid Queue ondersteunt terugkerende taken, concurrentiebeheer en geavanceerde functionaliteit zoals het pauzeren en hervatten per wachtrij. Voor applicaties die minder dan 10.000 taken per minuut verwerken, kan het de belasting probleemloos aan.
Solid Cache en Solid Cable
Solid Cache slaat gecachte HTML-fragmenten op in de database in plaats van in Memcached of Redis. Opslag op schijf (SSD/NVMe) kost een fractie van de prijs van RAM, waardoor aanzienlijk grotere cachepools met langere retentie mogelijk zijn.
# config/environments/production.rb
config.cache_store = :solid_cache_storeSolid Cable vervangt de Redis pub/sub-adapter van Action Cable. WebSocket-berichten worden naar een databasetabel geschreven en standaard elke 100 ms uitgelezen. Het resultaat is nagenoeg realtime communicatie voor de meeste toepassingen, met automatische opruiming van berichten na 24 uur.
# config/cable.yml
production:
adapter: solid_cable
polling_interval: 0.1
keep_messages_around_for: 1.dayDe native authenticatiegenerator
Rails 8 bevat een authenticatiegenerator die de benodigde scaffolding produceert voor inloggen, uitloggen en wachtwoordherstel op basis van sessies. Er zijn geen externe gems nodig voor standaard authenticatie.
# Generate the authentication scaffolding
bin/rails generate authenticationDit commando maakt het User-model, het Session-model, de SessionsController, de PasswordsController en een Authentication-concern aan. De gegenereerde code gebruikt has_secure_password met bcrypt en bevat rate limiting (10 inlogpogingen per 3 minuten per IP-adres).
# app/controllers/concerns/authentication.rb
module Authentication
extend ActiveSupport::Concern
included do
before_action :require_authentication
helper_method :authenticated?
end
private
def require_authentication
resume_session || request_authentication
end
def resume_session
Current.session = find_session_by_cookie
end
def find_session_by_cookie
Session.find_by(id: cookies.signed[:session_id]) if cookies.signed[:session_id]
end
def request_authentication
session[:return_to_after_authenticating] = request.url
redirect_to new_session_path
end
def authenticated?
Current.session.present?
end
endWachtwoordherstel maakt gebruik van ondertekende tokens met vervaldatum, gegenereerd door has_secure_password, in plaats van tokens die in de database worden opgeslagen. De generator omvat bewust geen gebruikersregistratie, e-mailverificatie of sociale login. De gegenereerde code dient als solide basis om uit te breiden, niet als volledige vervanging van Devise.
De native generator dekt inloggen, uitloggen en wachtwoordherstel. Gebruikersregistratie, e-mailverificatie, OAuth en multifactorauthenticatie moeten handmatig worden toegevoegd of via gems zoals Authentication Zero.
Veiligere parameterverwerking met params.expect
Rails 8 introduceert params.expect, een strenger alternatief voor het traditionele params.require.permit-patroon. De nieuwe methode gooit een uitzondering wanneer sleutels ontbreken, in plaats van stilzwijgend nil terug te geven.
# Before (Rails 7)
def user_params
params.require(:user).permit(:name, :email, :role)
end
# After (Rails 8)
def user_params
params.expect(user: [:name, :email, :role])
endDe expect-methode garandeert dat de :user-sleutel bestaat en uitsluitend de toegestane attributen bevat. Bij afwezigheid wordt onmiddellijk ActionController::ParameterMissing gegooid, wat stille fouten verderop in de uitvoeringsstroom voorkomt.
Propshaft: de nieuwe standaard asset-pipeline
Propshaft vervangt Sprockets als standaard asset-pipeline. Waar Sprockets compilatie, minificatie en fingerprinting in een monolithisch systeem afhandelde, richt Propshaft zich uitsluitend op het serveren en fingerprinting van statische bestanden.
Voor JavaScript-bundeling delegeert Propshaft naar moderne tools: esbuild, Vite of Bun. CSS-verwerking verloopt via Tailwind CLI of dart-sass. Het resultaat is een snellere, voorspelbaardere asset-pipeline die aansluit bij het huidige frontend-ecosysteem.
# Gemfile (Rails 8 default)
gem "propshaft"
# No configuration needed for basic usage
# Assets in app/assets are served and fingerprinted automaticallyBestaande applicaties die Sprockets gebruiken, kunnen dat zonder beperkingen blijven doen. Het migratiepad bestaat uit het verwijderen van Sprockets-specifieke directieven (//= require) en het overstappen op import maps of een JavaScript-bundler.
Klaar om je Ruby on Rails gesprekken te halen?
Oefen met onze interactieve simulatoren, flashcards en technische tests.
Kamal 2 en Thruster: zero-downtime deployment
Rails 8 wordt standaard geleverd met Kamal 2, een deployment-tool waarmee een kale Linux-server met een enkel commando wordt omgezet in een productieserver. Kamal 2 vervangt Traefik door Kamal Proxy, een reverse proxy die specifiek voor dit doel is ontworpen.
# Deploy to a fresh server
kamal setup
# Subsequent deployments
kamal deployThruster bevindt zich tussen Kamal Proxy en Puma. Het biedt X-Sendfile-versnelling voor bestandsdownloads, automatische assetcompressie (gzip/brotli) en HTTP/2-ondersteuning. Het door Rails 8 gegenereerde Dockerfile bevat Thruster standaard.
# Excerpt from Rails 8 generated Dockerfile
RUN gem install thruster
CMD ["thrust", "./bin/rails", "server"]Deze technologiestack (Kamal 2 + Kamal Proxy + Thruster + Puma) verzorgt SSL-terminatie, zero-downtime deployments en geleidelijke herstarts zonder externe diensten als Nginx of HAProxy.
Verbeterde SQLite-ondersteuning voor productie
Rails 8 verbetert de ondersteuning van SQLite voor productiegebruik aanzienlijk. Connection pooling, WAL-modus en verbeterde concurrency maken SQLite een haalbare optie voor kleine en middelgrote applicaties. In combinatie met de Solid Trifecta kan een enkele server een volledige Rails 8-applicatie op SQLite draaien, zonder externe databaseserver.
# config/database.yml (SQLite production setup)
production:
primary:
adapter: sqlite3
database: storage/production.sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
cache:
adapter: sqlite3
database: storage/production_cache.sqlite3
queue:
adapter: sqlite3
database: storage/production_queue.sqlite3
cable:
adapter: sqlite3
database: storage/production_cable.sqlite3Deze configuratie draait de volledige applicatiestack op vier SQLite-bestanden. Kamal koppelt de opslagmap als persistent volume, waardoor gegevens containerherstarts overleven.
Migratie van Rails 7 naar Rails 8
De migratie van Rails 7.2 naar Rails 8.0 verloopt soepel, mits de applicatie alle deprecation-waarschuwingen heeft opgelost. Applicaties op Rails 7.0 of 7.1 dienen stapsgewijs te upgraden: van 7.0 naar 7.1, vervolgens naar 7.2 en ten slotte naar 8.0.
Rails 8 vereist Ruby 3.2 of hoger. Controleer de geinstalleerde Ruby-versie, zorg ervoor dat de testsuite slaagt onder Rails 7.2 en verifieer de compatibiliteit van gems via RailsBump voordat de upgrade wordt gestart.
Stap 1: afhankelijkheden bijwerken
# Gemfile
gem "rails", "~> 8.0"bundle update railsStap 2: de updatetaak uitvoeren
bin/rails app:updateDit commando werkt de configuratiebestanden bij naar de standaardwaarden van Rails 8. Het is essentieel om elke wijziging zorgvuldig te beoordelen met git diff. Belangrijke wijzigingen omvatten de nieuwe standaardwaarde van Regexp.timeout (1 seconde), het gewijzigde gedrag van db:migrate (schemalade op lege databases) en de Propshaft-configuratie.
Stap 3: schemaherschikking afhandelen
Rails 8 herschikt de kolommen in schema.rb zodat deze overeenkomen met de werkelijke kolomvolgorde in de database. Het verdient aanbeveling om de schemadump direct uit te voeren, zodat deze cosmetische wijziging gescheiden blijft van daadwerkelijke migratiewijzigingen:
bin/rails db:schema:dump
git add db/schema.rb
git commit -m "Reorder schema columns for Rails 8"Stap 4: nieuwe functies geleidelijk adopteren
De Solid Trifecta, Propshaft en de authenticatiegenerator zijn optioneel voor bestaande applicaties. Het is raadzaam deze afzonderlijk te adopteren nadat de hoofdupgrade is gestabiliseerd:
- De taakadapter vervangen door Solid Queue
- De cachestore overzetten naar Solid Cache
- Action Cable migreren naar Solid Cable (indien van toepassing)
- De migratie van de asset-pipeline naar Propshaft evalueren
Stap 5: parameterverwerking moderniseren
Alle params.require.permit-aanroepen in de controllers vervangen door params.expect. Deze wijziging is optioneel maar sterk aanbevolen voor robuustere parametervalidatie.
Rails 8.1: Continuable Jobs en ingebouwde CI
Rails 8.1, uitgebracht in oktober 2025, bouwt voort op de fundamenten van Rails 8 met twee opvallende functionaliteiten. Continuable Jobs (ActiveJob::Continuable) splitsen langlopende taken op in hervattbare stappen. Wanneer een server herstart tijdens een importtaak, wordt de taak exact hervat op het punt waar deze was gestopt in plaats van helemaal opnieuw te beginnen.
# app/jobs/import_records_job.rb
class ImportRecordsJob < ApplicationJob
include ActiveJob::Continuable
def perform(cursor:)
records = Record.where("id > ?", cursor.value || 0).limit(1000)
records.each do |record|
process(record)
cursor.advance(record.id)
end
end
endRails 8.1 introduceert daarnaast een ingebouwde CI-configuratie en native Markdown-rendering, waardoor het aantal externe afhankelijkheden verder wordt teruggebracht.
Conclusie
Rails 8 markeert een fundamentele verschuiving in de filosofie van het framework, waarbij operationele eenvoud centraal staat zonder concessies te doen aan functionaliteit. De belangrijkste punten op een rij:
- De Solid Trifecta (Queue, Cache, Cable) elimineert Redis als verplichte afhankelijkheid voor achtergrondtaken, caching en WebSockets
- De native authenticatiegenerator biedt een basis voor sessiegerichte authenticatie zonder externe gems
params.expectvervangtparams.require.permitmet een striktere en veiligere parameterverwerking- Propshaft vervangt Sprockets als standaard asset-pipeline en delegeert bundeling naar moderne tools
- Kamal 2 en Thruster maken zero-downtime deployments mogelijk zonder Nginx of Capistrano
- De migratie vanaf Rails 7.2 is incrementeel: afhankelijkheden bijwerken,
app:updateuitvoeren en nieuwe functies geleidelijk adopteren - Rails 8.1 voegt Continuable Jobs en ingebouwde CI toe voor teams die het aantal externe tools willen reduceren
Begin met oefenen!
Test je kennis met onze gespreksimulatoren en technische tests.
Tags
Delen
