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.

Illustratie van de nieuwe functies en migratiehandleiding van Ruby on Rails 8

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 in het kort

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.

ruby
# 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.1

De Puma-plugin start Solid Queue samen met de webserver in de ontwikkelomgeving, waardoor een apart proces overbodig wordt:

ruby
# 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.

ruby
# config/environments/production.rb
config.cache_store = :solid_cache_store

Solid 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.

yaml
# config/cable.yml
production:
  adapter: solid_cable
  polling_interval: 0.1
  keep_messages_around_for: 1.day

De 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.

bash
# Generate the authentication scaffolding
bin/rails generate authentication

Dit 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).

ruby
# 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
end

Wachtwoordherstel 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.

Reikwijdte van de generator

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.

ruby
# 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])
end

De 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.

ruby
# Gemfile (Rails 8 default)
gem "propshaft"

# No configuration needed for basic usage
# Assets in app/assets are served and fingerprinted automatically

Bestaande 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.

bash
# Deploy to a fresh server
kamal setup

# Subsequent deployments
kamal deploy

Thruster 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.

dockerfile
# 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.

yaml
# 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.sqlite3

Deze 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.

Vereisten vooraf controleren

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

ruby
# Gemfile
gem "rails", "~> 8.0"
bash
bundle update rails

Stap 2: de updatetaak uitvoeren

bash
bin/rails app:update

Dit 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:

bash
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:

  1. De taakadapter vervangen door Solid Queue
  2. De cachestore overzetten naar Solid Cache
  3. Action Cable migreren naar Solid Cable (indien van toepassing)
  4. 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.

ruby
# 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
end

Rails 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.expect vervangt params.require.permit met 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:update uitvoeren 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

#ruby-on-rails
#rails-8
#tutorial
#migration
#solid-queue
#solid-cache
#authentication

Delen

Gerelateerde artikelen