Ruby on Rails 8: Нові можливості та повний гайд з міграції 2026

Rails 8 впроваджує Solid Trifecta, вбудовану автентифікацію, Kamal 2 та Propshaft. Детальний посібник з прикладами коду та покроковою міграцією з Rails 7.

Ruby on Rails 8 нові можливості та гайд з міграції ілюстрація

Ruby on Rails 8 знаменує собою переломний момент в історії фреймворку. Випущений у листопаді 2024 року та вдосконалений у Rails 8.1 у жовтні 2025 року, цей реліз усуває зовнішні залежності, які роками ускладнювали продакшн-архітектури. Redis, Sprockets, Capistrano — всі ці компоненти Rails 8 робить опціональними завдяки вбудованим альтернативам, що працюють безпосередньо з базою даних. Для розробників це означає значне спрощення розгортання, зниження витрат на інфраструктуру та нижчий поріг входження для проєктів середнього масштабу.

Rails 8 у двох словах

Rails 8 замінює Redis на Solid Trifecta (Solid Queue, Solid Cache, Solid Cable), включає нативний генератор автентифікації, використовує Propshaft як стандартний asset pipeline та інтегрує Kamal 2 для безперебійних деплоїв. Мінімальна версія Ruby — 3.2.

Solid Trifecta: інфраструктура на базі даних

До Rails 8 кожен серйозний продакшн-застосунок залежав від Redis для трьох критичних функцій: фонових завдань, кешування та pub/sub для WebSocket. Solid Trifecta замінює всі три компоненти адаптерами, сумісними з PostgreSQL, MySQL та SQLite, що працюють безпосередньо з реляційною базою даних.

Оперативна перевага очевидна: більше не потрібно розгортати, моніторити та підтримувати окремий інстанс Redis. Компроміс стосується сирої продуктивності — Redis залишається швидшим у сценаріях з надвисоким навантаженням, але для переважної більшості застосунків адаптери на базі даних забезпечують достатню продуктивність. Basecamp, флагманський продукт 37signals, використовує Solid Cache обсягом 10 ТБ у продакшні з ретенцією 60 днів.

Solid Queue: фонові завдання без Redis

Solid Queue замінює Sidekiq, Resque або Delayed Job як бекенд Active Job, що працює з базою даних. Він використовує FOR UPDATE SKIP LOCKED на PostgreSQL 9.5+ та MySQL 8.0+, з fallback-механізмом для 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

Плагін Puma запускає Solid Queue разом із веб-сервером у режимі розробки, що усуває необхідність окремого процесу:

ruby
# config/puma.rb
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] || Rails.env.development?

Solid Queue підтримує періодичні завдання, контроль конкурентності та розширені функції на кшталт призупинення та відновлення роботи черг. Для застосунків, що обробляють менше 10 000 завдань на хвилину, він справляється з навантаженням без проблем.

Solid Cache та Solid Cable

Solid Cache зберігає кешовані HTML-фрагменти в базі даних замість Memcached або Redis. Зберігання на диску (SSD/NVMe) коштує значно менше за оперативну пам'ять, що дозволяє створювати набагато більші пули кешу з довшим терміном зберігання.

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

Solid Cable замінює Redis-адаптер pub/sub для Action Cable. WebSocket-повідомлення записуються в таблицю та опитуються кожні 100 мс за замовчуванням. Результат — майже реальний час комунікації для більшості випадків використання з автоматичним очищенням повідомлень через 24 години.

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

Нативний генератор автентифікації

Rails 8 включає генератор автентифікації, який створює scaffolding для входу, виходу та скидання пароля. Жодних зовнішніх гемів не потрібно для базової автентифікації.

bash
# Generate the authentication scaffolding
bin/rails generate authentication

Ця команда створює модель User, модель Session, SessionsController, PasswordsController та concern Authentication. Згенерований код використовує has_secure_password з bcrypt та включає rate limiting (10 спроб входу кожні 3 хвилини з однієї IP-адреси).

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

Скидання пароля базується на підписаних токенах із терміном дії, згенерованих через has_secure_password, а не на токенах, що зберігаються в базі даних. Генератор навмисно не включає реєстрацію, підтвердження email чи соціальну автентифікацію. Згенерований код є міцною основою для розширення, а не повноцінною заміною Devise.

Межі генератора

Нативний генератор охоплює вхід, вихід та скидання пароля. Реєстрацію користувачів, підтвердження email, OAuth та багатофакторну автентифікацію потрібно додавати вручну або через геми на кшталт Authentication Zero.

Безпечна обробка параметрів з params.expect

Rails 8 представляє params.expect — більш сувору альтернативу традиційному params.require.permit. Новий підхід викидає виняток, коли ключі відсутні, замість мовчазного повернення nil.

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

Метод expect гарантує, що ключ :user існує і містить лише дозволені атрибути. У разі відсутності він негайно викидає ActionController::ParameterMissing, що запобігає тихим помилкам далі в потоці виконання.

Propshaft: новий стандартний asset pipeline

Propshaft замінює Sprockets як стандартний asset pipeline. Там, де Sprockets обробляв компіляцію, мініфікацію та fingerprinting у монолітній системі, Propshaft зосереджується виключно на обслуговуванні та fingerprinting статичних файлів.

Для бандлінгу JavaScript Propshaft делегує сучасним інструментам: esbuild, Vite або Bun. Обробка CSS відбувається через Tailwind CLI або dart-sass. Результат — швидший, передбачуваніший asset pipeline, що відповідає сучасній frontend-екосистемі.

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

Існуючі застосунки, що використовують Sprockets, можуть продовжувати це робити без обмежень. Міграція полягає у видаленні специфічних для Sprockets директив (//= require) та переході на import maps або JavaScript-бандлер.

Готовий до співбесід з Ruby on Rails?

Практикуйся з нашими інтерактивними симуляторами, flashcards та технічними тестами.

Kamal 2 та Thruster: безперебійне розгортання

Rails 8 попередньо налаштований з Kamal 2 — інструментом розгортання, здатним перетворити чистий Linux-сервер на продакшн-сервер однією командою. Kamal 2 замінює Traefik на Kamal Proxy — реверс-проксі, спеціально розроблений для цього випадку використання.

bash
kamal setup
kamal deploy

Thruster розташовується між Kamal Proxy та Puma. Він забезпечує X-Sendfile прискорення для завантаження файлів, автоматичне стиснення ассетів (gzip/brotli) та підтримку HTTP/2. Dockerfile, згенерований Rails 8, включає Thruster за замовчуванням.

dockerfile
RUN gem install thruster
CMD ["thrust", "./bin/rails", "server"]

Цей технологічний стек (Kamal 2 + Kamal Proxy + Thruster + Puma) обробляє SSL-термінацію, деплої без простою та поступові перезапуски без зовнішніх сервісів на кшталт Nginx чи HAProxy.

Покращена підтримка SQLite для продакшну

Rails 8 значно покращує підтримку SQLite у продакшні. Connection pooling, WAL-режим та покращена конкурентність роблять SQLite життєздатним для малих та середніх застосунків. У поєднанні з Solid Trifecta один сервер може запустити повноцінний Rails 8 застосунок виключно на SQLite, без жодного зовнішнього сервера бази даних.

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

Ця конфігурація запускає весь application stack із чотирьох SQLite-файлів. Kamal монтує директорію storage як persistent volume, гарантуючи збереження даних при перезапусках контейнерів.

Міграція з Rails 7 на Rails 8

Міграція з Rails 7.2 на Rails 8.0 проходить гладко за умови, що застосунок попередньо виправив усі deprecation warnings. Застосунки на Rails 7.0 або 7.1 повинні мігрувати поетапно: з 7.0 на 7.1, потім з 7.1 на 7.2, і нарешті з 7.2 на 8.0.

Передумови для перевірки

Rails 8 вимагає Ruby 3.2 або новішої версії. Необхідно перевірити встановлену версію Ruby, переконатися, що тести проходять на Rails 7.2, та перевірити сумісність гемів через RailsBump перед оновленням.

Крок 1: оновлення залежностей

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

Крок 2: виконання задачі оновлення

bash
bin/rails app:update

Ця команда оновлює конфігураційні файли до значень за замовчуванням Rails 8. Важливо переглянути кожну зміну через git diff. Помітні зміни включають нове значення за замовчуванням Regexp.timeout (1 секунда), змінену поведінку db:migrate (завантаження схеми для порожніх баз даних) та конфігурацію Propshaft.

Крок 3: обробка реорганізації схеми

Rails 8 переупорядковує колонки в schema.rb відповідно до реального порядку колонок у базі даних. Рекомендується виконати dump схеми одразу, щоб ізолювати цю косметичну зміну від справжніх змін міграцій:

bash
bin/rails db:schema:dump
git add db/schema.rb
git commit -m "Reorder schema columns for Rails 8"

Крок 4: поступове впровадження нових можливостей

Solid Trifecta, Propshaft та генератор автентифікації залишаються опціональними для існуючих застосунків. Рекомендується впроваджувати їх індивідуально після стабілізації основного оновлення:

  1. Замінити адаптер завдань на Solid Queue
  2. Перевести cache store на Solid Cache
  3. Мігрувати Action Cable на Solid Cable (за потреби)
  4. Оцінити міграцію asset pipeline на Propshaft

Крок 5: модернізація обробки параметрів

Замінити виклики params.require.permit на params.expect у всіх контролерах. Ця зміна опціональна, але наполегливо рекомендована для більш надійної валідації параметрів.

Rails 8.1: Continuable Jobs та вбудований CI

Rails 8.1, випущений у жовтні 2025 року, розширює фундамент Rails 8 двома визначними функціями. Continuable Jobs (ActiveJob::Continuable) розбивають тривалі завдання на етапи, що автоматично відновлюються. Якщо сервер перезавантажується посеред імпорту, завдання продовжується з того місця, де зупинилося, замість перезапуску з нуля.

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 також представляє вбудовану CI-конфігурацію та нативний рендеринг Markdown, ще більше зменшуючи зовнішні залежності.

Висновок

Rails 8 являє собою значний зсув у філософії фреймворку, віддаючи пріоритет операційній простоті без компромісів щодо функціональності. Ключові моменти:

  • Solid Trifecta (Queue, Cache, Cable) усуває Redis як обов'язкову залежність для завдань, кешування та WebSocket
  • Нативний генератор автентифікації надає основу для сесійної автентифікації без сторонніх гемів
  • params.expect замінює params.require.permit на більш сувору та безпечну обробку параметрів
  • Propshaft заміщує Sprockets як стандартний asset pipeline, делегуючи бандлінг сучасним інструментам
  • Kamal 2 та Thruster забезпечують безперебійні деплої без Nginx чи Capistrano
  • Міграція з Rails 7.2 є інкрементальною: оновлення залежностей, виконання app:update та поступове впровадження нових можливостей
  • Rails 8.1 додає Continuable Jobs та вбудований CI для команд, що прагнуть скоротити зовнішні інструменти

Починай практикувати!

Перевір свої знання з нашими симуляторами співбесід та технічними тестами.

Теги

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

Поділитися

Пов'язані статті