Ruby on Rails 8: Przewodnik po Nowych Funkcjach i Migracji 2026
Rails 8 wprowadza Solid Trifecta, natywne uwierzytelnianie, Kamal 2 oraz Propshaft. Kompleksowy przewodnik z przykładami kodu i krokami migracji z Rails 7.

Ruby on Rails 8 stanowi punkt zwrotny w historii tego frameworka. Wydany w listopadzie 2024 roku i ugruntowany wraz z Rails 8.1 w październiku 2025, ten cykl wydań eliminuje zewnętrzne zależności, które od lat obciążały architektury produkcyjne. Redis, Sprockets, Capistrano - wszystkie te komponenty Rails 8 czyni opcjonalnymi dzięki wbudowanym alternatywom opartym na bazie danych. Dla zespołów programistycznych ta przebudowa znacząco upraszcza wdrożenia, redukuje koszty infrastruktury i obniża barierę wejścia dla projektów średniej wielkości.
Rails 8 zastępuje Redis przez Solid Trifecta (Solid Queue, Solid Cache, Solid Cable), integruje natywny generator uwierzytelniania, przyjmuje Propshaft jako domyślny pipeline zasobów i zawiera Kamal 2 do wdrożeń bez przestojów. Wymagany jest Ruby 3.2 lub nowszy.
Solid Trifecta: infrastruktura oparta na bazie danych
Przed Rails 8 każda poważna aplikacja produkcyjna zależała od Redis dla trzech krytycznych funkcji: zadań w tle, cache oraz pub/sub WebSocket. Solid Trifecta zastępuje te trzy elementy adapterami kompatybilnymi z PostgreSQL, MySQL i SQLite, bezpośrednio zarządzanymi przez istniejącą relacyjną bazę danych.
Korzyść operacyjna jest natychmiastowa: nie trzeba już provisionować, monitorować i utrzymywać osobnej instancji Redis. Kompromis dotyczy surowej wydajności. Redis pozostaje szybszy w scenariuszach o bardzo wysokiej przepustowości, ale dla zdecydowanej większości aplikacji adaptery oparte na bazie danych oferują w pełni wystarczającą wydajność. Basecamp, flagowa aplikacja 37signals, obsługuje 10 TB Solid Cache w produkcji z 60-dniowym okresem retencji.
Solid Queue: zadania w tle bez Redis
Solid Queue zastępuje Sidekiq, Resque lub Delayed Job jako backend Active Job oparty na bazie danych. Wykorzystuje FOR UPDATE SKIP LOCKED na PostgreSQL 9.5+ i MySQL 8.0+, z mechanizmem fallback dla 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.1Plugin Puma uruchamia Solid Queue obok serwera web w środowisku deweloperskim, co eliminuje konieczność uruchamiania osobnego procesu:
# config/puma.rb
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] || Rails.env.development?Solid Queue obsługuje zadania cykliczne, kontrolę współbieżności oraz zaawansowane funkcje takie jak wstrzymywanie i wznawianie według kolejki. Dla aplikacji przetwarzających mniej niż 10 000 zadań na minutę, absorbuje obciążenie bez trudności.
Solid Cache i Solid Cable
Solid Cache przechowuje fragmenty HTML w bazie danych zamiast w Memcached lub Redis. Przechowywanie na dysku (SSD/NVMe) kosztuje ułamek ceny RAM, co pozwala na znacznie większe pule cache z dłuższym okresem retencji.
# config/environments/production.rb
config.cache_store = :solid_cache_storeSolid Cable zastępuje adapter pub/sub Redis w Action Cable. Wiadomości WebSocket są zapisywane w tabeli i odpytywane co 100 ms domyślnie. Rezultat: komunikacja niemal w czasie rzeczywistym dla większości przypadków użycia, z automatycznym czyszczeniem wiadomości po 24 godzinach.
# config/cable.yml
production:
adapter: solid_cable
polling_interval: 0.1
keep_messages_around_for: 1.dayNatywny generator uwierzytelniania
Rails 8 integruje generator uwierzytelniania, który tworzy scaffolding niezbędny do logowania, wylogowywania i resetowania hasła. Żadna zewnętrzna gem nie jest wymagana do podstawowego uwierzytelniania.
# Generate the authentication scaffolding
bin/rails generate authenticationTo polecenie tworzy model User, model Session, SessionsController, PasswordsController oraz concern Authentication. Wygenerowany kod używa has_secure_password z bcrypt i zawiera limitowanie prób (10 prób logowania co 3 minuty na IP).
# 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
endResetowanie hasła opiera się na podpisanych tokenach z wygaśnięciem, generowanych przez has_secure_password, a nie na tokenach przechowywanych w bazie. Generator celowo nie zawiera rejestracji, weryfikacji adresu e-mail ani uwierzytelniania społecznościowego. Wygenerowany kod stanowi solidną bazę do rozbudowy, nie pełne zastąpienie Devise.
Natywny generator obejmuje logowanie, wylogowywanie i resetowanie hasła. Rejestracja użytkownika, weryfikacja e-mail, OAuth i uwierzytelnianie wieloskładnikowe muszą być dodane ręcznie lub za pomocą gemów takich jak Authentication Zero.
Bezpieczna obsługa parametrów z params.expect
Rails 8 wprowadza params.expect, bardziej rygorystyczną alternatywę dla tradycyjnego params.require.permit. Nowa metoda rzuca wyjątek gdy brakuje kluczy, zamiast zwracać nil po cichu.
# 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])
endMetoda expect gwarantuje, że klucz :user istnieje i zawiera tylko dozwolone atrybuty. W przypadku braku natychmiast rzuca ActionController::ParameterMissing, co zapobiega cichym błędom w dalszym przepływie wykonania.
Propshaft: nowy domyślny pipeline zasobów
Propshaft zastępuje Sprockets jako domyślny pipeline zasobów. Tam gdzie Sprockets obsługiwał kompilację, minifikację i fingerprinting w monolitycznym systemie, Propshaft koncentruje się wyłącznie na serwowaniu i fingerprintingu plików statycznych.
Do bundlowania JavaScript Propshaft deleguje do nowoczesnych narzędzi: esbuild, Vite lub Bun. Przetwarzanie CSS przechodzi przez Tailwind CLI lub dart-sass. Rezultatem jest szybszy, bardziej przewidywalny pipeline zasobów, dopasowany do obecnego ekosystemu frontend.
# Gemfile (Rails 8 default)
gem "propshaft"Istniejące aplikacje korzystające ze Sprockets mogą nadal to robić bez ograniczeń. Migracja polega na usunięciu dyrektyw specyficznych dla Sprockets (//= require) i przyjęciu import maps lub bundlera JavaScript.
Gotowy na rozmowy o Ruby on Rails?
Ćwicz z naszymi interaktywnymi symulatorami, flashcards i testami technicznymi.
Kamal 2 i Thruster: wdrożenia bez przestojów
Rails 8 jest wstępnie skonfigurowany z Kamal 2, narzędziem do wdrożeń zdolnym przekształcić czysty serwer Linux w serwer produkcyjny jednym poleceniem. Kamal 2 zastępuje Traefik przez Kamal Proxy, reverse proxy zaprojektowany specjalnie do tego celu.
kamal setup
kamal deployThruster znajduje się między Kamal Proxy a Puma. Zapewnia akcelerację X-Sendfile dla pobierania plików, automatyczną kompresję zasobów (gzip/brotli) oraz wsparcie HTTP/2. Dockerfile generowany przez Rails 8 zawiera Thruster domyślnie.
RUN gem install thruster
CMD ["thrust", "./bin/rails", "server"]Ten stack technologiczny (Kamal 2 + Kamal Proxy + Thruster + Puma) obsługuje terminację SSL, wdrożenia bez przestojów i stopniowe restarty bez korzystania z zewnętrznych serwisów jak Nginx czy HAProxy.
Wzmocnione wsparcie SQLite dla produkcji
Rails 8 znacząco poprawia wsparcie SQLite w produkcji. Connection pooling, tryb WAL i ulepszona współbieżność czynią SQLite odpowiednim dla małych i średnich aplikacji. W połączeniu z Solid Trifecta, pojedynczy serwer może obsługiwać aplikację Rails 8 całkowicie na SQLite, bez żadnego zewnętrznego serwera bazy danych.
# 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.sqlite3Ta konfiguracja uruchamia cały stack aplikacji z czterech plików SQLite. Kamal montuje katalog storage jako persistent volume, gwarantując że dane przetrwają restarty kontenerów.
Migracja z Rails 7 do Rails 8
Migracja z Rails 7.2 do Rails 8.0 przebiega płynnie, pod warunkiem że aplikacja wcześniej naprawiła ostrzeżenia o deprecjacji. Aplikacje na Rails 7.0 lub 7.1 muszą przechodzić etapami: z 7.0 do 7.1, potem z 7.1 do 7.2, a na końcu z 7.2 do 8.0.
Rails 8 wymaga Ruby 3.2 lub nowszego. Należy zweryfikować zainstalowaną wersję Ruby, upewnić się że testy przechodzą pod Rails 7.2 i sprawdzić kompatybilność gemów przez RailsBump przed rozpoczęciem aktualizacji.
Krok 1: aktualizacja zależności
# Gemfile
gem "rails", "~> 8.0"bundle update railsKrok 2: uruchomienie zadania aktualizacji
bin/rails app:updateTo polecenie aktualizuje pliki konfiguracyjne do domyślnych wartości Rails 8. Istotne jest przejrzenie każdej zmiany za pomocą git diff. Godne uwagi zmiany obejmują nową domyślną wartość Regexp.timeout (1 sekunda), zmienione zachowanie db:migrate (ładowanie schematu na pustych bazach) oraz konfigurację Propshaft.
Krok 3: obsługa reorganizacji schematu
Rails 8 zmienia kolejność kolumn w schema.rb aby odzwierciedlić rzeczywistą kolejność kolumn w bazie. Zaleca się natychmiastowe wykonanie zrzutu schematu, aby wyizolować tę kosmetyczną zmianę od rzeczywistych zmian migracji:
bin/rails db:schema:dump
git add db/schema.rb
git commit -m "Reorder schema columns for Rails 8"Krok 4: stopniowe przyjmowanie nowych funkcji
Solid Trifecta, Propshaft i generator uwierzytelniania pozostają opcjonalne dla istniejących aplikacji. Lepiej jest je przyjmować indywidualnie po ustabilizowaniu głównej aktualizacji:
- Zamienić adapter zadań na Solid Queue
- Przełączyć store cache na Solid Cache
- Migrować Action Cable do Solid Cable (jeśli dotyczy)
- Ocenić migrację pipeline zasobów do Propshaft
Krok 5: modernizacja obsługi parametrów
Zamienić wywołania params.require.permit na params.expect we wszystkich kontrolerach. Ta zmiana jest opcjonalna, ale silnie zalecana dla bardziej solidnej walidacji parametrów.
Rails 8.1: Continuable Jobs i wbudowane CI
Rails 8.1, wydany w październiku 2025, rozszerza fundamenty położone przez Rails 8 o dwie znaczące funkcje. Continuable Jobs (ActiveJob::Continuable) dzielą długotrwałe zadania na kroki, które są automatycznie wznawiane. Jeśli serwer restartuje się w środku importu, zadanie wznawia się dokładnie tam gdzie się zatrzymało, zamiast zaczynać od nowa.
# 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 wprowadza również wbudowaną konfigurację CI oraz natywne renderowanie Markdown, jeszcze bardziej redukując zewnętrzne zależności.
Podsumowanie
Rails 8 reprezentuje znaczący zwrot w filozofii frameworka, przedkładając prostotę operacyjną bez kompromisów w zakresie funkcjonalności. Kluczowe punkty do zapamiętania:
- Solid Trifecta (Queue, Cache, Cable) eliminuje Redis jako obowiązkową zależność dla zadań, cache i WebSocketów
- Natywny generator uwierzytelniania zapewnia bazę dla uwierzytelniania opartego na sesjach bez zewnętrznych gemów
params.expectzastępujeparams.require.permitbardziej rygorystyczną i bezpieczniejszą obsługą parametrów- Propshaft zastępuje Sprockets jako domyślny pipeline zasobów, delegując bundlowanie do nowoczesnych narzędzi
- Kamal 2 i Thruster umożliwiają wdrożenia bez przestojów bez korzystania z Nginx czy Capistrano
- Migracja z Rails 7.2 jest inkrementalna: aktualizacja zależności, uruchomienie
app:updatei stopniowe przyjmowanie nowych funkcji - Rails 8.1 dodaje Continuable Jobs i wbudowane CI dla zespołów chcących zredukować zewnętrzne narzędzia
Zacznij ćwiczyć!
Sprawdź swoją wiedzę z naszymi symulatorami rozmów i testami technicznymi.
Tagi
Udostępnij
