Ruby on Rails 8: Tính năng mới và Hướng dẫn nâng cấp toàn diện 2026

Rails 8 giới thiệu Solid Trifecta, xác thực tích hợp, Kamal 2 và Propshaft. Hướng dẫn đầy đủ với mã mẫu và các bước nâng cấp từ Rails 7.

Minh họa các tính năng mới và hướng dẫn nâng cấp Ruby on Rails 8

Ruby on Rails 8 đánh dấu bước ngoặt quan trọng nhất trong lịch sử phát triển của framework kể từ phiên bản Rails 7. Được phát hành vào tháng 11 năm 2024 và được củng cố thêm với Rails 8.1 vào tháng 10 năm 2025, chu kỳ phiên bản này loại bỏ nhiều phụ thuộc bên ngoài vốn gây phức tạp cho kiến trúc sản xuất trong nhiều năm. Redis, Sprockets, Capistrano — tất cả đều trở thành tùy chọn nhờ các giải pháp thay thế tích hợp, được hỗ trợ trực tiếp bởi cơ sở dữ liệu. Đối với các đội ngũ phát triển, sự thay đổi này đơn giản hóa đáng kể quy trình triển khai, giảm chi phí hạ tầng và hạ thấp rào cản gia nhập cho các dự án có quy mô vừa.

Tổng quan Rails 8

Rails 8 thay thế Redis bằng Solid Trifecta (Solid Queue, Solid Cache, Solid Cable), tích hợp bộ sinh mã xác thực, chuyển sang Propshaft làm pipeline xử lý tài nguyên mặc định và tích hợp Kamal 2 cho việc triển khai không gián đoạn. Yêu cầu Ruby 3.2 trở lên.

Solid Trifecta: Hạ tầng được hỗ trợ bởi cơ sở dữ liệu

Trước Rails 8, hầu hết các ứng dụng sản xuất đều phụ thuộc vào Redis cho ba chức năng quan trọng: xử lý tác vụ nền, bộ nhớ đệm và pub/sub WebSocket. Solid Trifecta thay thế cả ba thành phần này bằng các adapter tương thích với PostgreSQL, MySQL và SQLite, được điều khiển trực tiếp từ cơ sở dữ liệu quan hệ hiện có.

Lợi ích về mặt vận hành là rất rõ ràng: không cần phải cung cấp, giám sát và bảo trì một instance Redis riêng biệt. Sự đánh đổi nằm ở hiệu suất thuần túy. Redis vẫn nhanh hơn trong các tình huống lưu lượng rất cao, nhưng đối với phần lớn các ứng dụng, các adapter dựa trên cơ sở dữ liệu cung cấp hiệu suất hoàn toàn đủ dùng. Basecamp, ứng dụng chính của 37signals, vận hành một Solid Cache 10 TB trong môi trường sản xuất với thời gian lưu trữ 60 ngày.

Solid Queue: Xử lý tác vụ nền không cần Redis

Solid Queue thay thế Sidekiq, Resque hoặc Delayed Job với tư cách là backend Active Job được hỗ trợ bởi cơ sở dữ liệu. Nó sử dụng FOR UPDATE SKIP LOCKED trên PostgreSQL 9.5+ và MySQL 8.0+, với cơ chế dự phòng cho 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

Plugin Puma khởi động Solid Queue cùng với máy chủ web trong môi trường phát triển, giúp tránh việc phải chạy một tiến trình riêng biệt:

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

Solid Queue hỗ trợ các tác vụ định kỳ, kiểm soát đồng thời và các tính năng nâng cao như tạm dừng và tiếp tục theo hàng đợi. Đối với các ứng dụng xử lý dưới 10.000 tác vụ mỗi phút, nó xử lý tải trọng mà không gặp bất kỳ khó khăn nào.

Solid Cache và Solid Cable

Solid Cache lưu trữ các đoạn HTML cache trong cơ sở dữ liệu thay vì Memcached hoặc Redis. Lưu trữ trên đĩa (SSD/NVMe) có chi phí chỉ bằng một phần nhỏ so với RAM, cho phép tạo các pool cache lớn hơn nhiều với thời gian lưu trữ dài hơn. Basecamp vận hành Solid Cache 10 TB với thời gian lưu trữ 60 ngày trong môi trường sản xuất.

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

Solid Cable thay thế adapter pub/sub Redis của Action Cable. Các thông điệp WebSocket được ghi vào một bảng cơ sở dữ liệu và được truy vấn mỗi 100ms theo mặc định. Kết quả là giao tiếp gần thời gian thực cho hầu hết các trường hợp sử dụng, với các thông điệp được tự động xóa sau 24 giờ.

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

Bộ sinh mã xác thực tích hợp

Rails 8 tích hợp sẵn một bộ sinh mã xác thực tạo ra các thành phần cần thiết cho đăng nhập, đăng xuất và đặt lại mật khẩu dựa trên phiên làm việc. Không cần bất kỳ gem bên ngoài nào cho xác thực cơ bản.

bash
# Generate the authentication scaffolding
bin/rails generate authentication

Lệnh này tạo ra model User, model Session, SessionsController, PasswordsController và một concern Authentication. Mã nguồn được tạo sử dụng has_secure_password với bcrypt và bao gồm giới hạn số lần thử (10 lần đăng nhập mỗi 3 phút cho mỗi địa chỉ 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

Chức năng đặt lại mật khẩu sử dụng các token có chữ ký và thời hạn hết hạn, được tạo bởi has_secure_password, thay vì lưu trữ token trong cơ sở dữ liệu. Bộ sinh mã có chủ đích không bao gồm đăng ký tài khoản, xác minh địa chỉ email hay đăng nhập qua mạng xã hội. Mã nguồn được tạo là nền tảng vững chắc để mở rộng, không phải là sự thay thế hoàn chỉnh cho Devise.

Phạm vi của bộ sinh mã xác thực

Bộ sinh mã tích hợp bao gồm đăng nhập, đăng xuất và đặt lại mật khẩu. Đăng ký tài khoản, xác minh email, OAuth và xác thực đa yếu tố cần được thêm thủ công hoặc thông qua các gem như Authentication Zero.

Xử lý tham số an toàn hơn với params.expect

Rails 8 giới thiệu params.expect, một phương thức thay thế nghiêm ngặt hơn cho kiểu params.require.permit truyền thống. Phương thức mới ném ra ngoại lệ khi các khóa bị thiếu, thay vì trả về nil một cách âm thầm.

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

Phương thức expect đảm bảo rằng khóa :user tồn tại và chỉ chứa các thuộc tính được cho phép. Nếu khóa không tồn tại, nó sẽ lập tức ném ra ActionController::ParameterMissing, ngăn chặn các lỗi âm thầm ở các giai đoạn sau của luồng xử lý.

Propshaft: Pipeline xử lý tài nguyên mặc định mới

Propshaft thay thế Sprockets làm pipeline xử lý tài nguyên mặc định. Trong khi Sprockets quản lý việc biên dịch, nén và gán dấu vân tay (fingerprinting) trong một hệ thống nguyên khối, Propshaft chỉ tập trung vào việc phục vụ và gán dấu vân tay cho các tập tin tĩnh.

Để đóng gói JavaScript, Propshaft ủy quyền cho các công cụ hiện đại: esbuild, Vite hoặc Bun. Việc xử lý CSS được thực hiện thông qua Tailwind CLI hoặc dart-sass. Kết quả là một pipeline xử lý tài nguyên nhanh hơn, dễ dự đoán hơn và phù hợp với hệ sinh thái frontend hiện tại.

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

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

Các ứng dụng hiện có đang sử dụng Sprockets có thể tiếp tục sử dụng mà không gặp vấn đề gì. Quy trình chuyển đổi bao gồm việc xóa các chỉ thị đặc thù của Sprockets (//= require) và sử dụng import maps hoặc một bộ đóng gói JavaScript.

Sẵn sàng chinh phục phỏng vấn Ruby on Rails?

Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.

Kamal 2 và Thruster: Triển khai không gián đoạn

Rails 8 được cấu hình sẵn với Kamal 2, một công cụ triển khai có khả năng biến một máy chủ Linux mới thành máy chủ sản xuất chỉ bằng một lệnh duy nhất. Kamal 2 thay thế Traefik bằng Kamal Proxy, một reverse proxy được thiết kế riêng cho mục đích này.

bash
# Deploy to a fresh server
kamal setup

# Subsequent deployments
kamal deploy

Thruster nằm giữa Kamal Proxy và Puma, cung cấp tăng tốc X-Sendfile cho việc tải tập tin, nén tài nguyên tự động (gzip/brotli) và hỗ trợ HTTP/2. Dockerfile được tạo bởi Rails 8 bao gồm Thruster theo mặc định.

dockerfile
# Excerpt from Rails 8 generated Dockerfile
RUN gem install thruster
CMD ["thrust", "./bin/rails", "server"]

Bộ công nghệ này (Kamal 2 + Kamal Proxy + Thruster + Puma) xử lý việc chứng chỉ SSL, triển khai không gián đoạn và khởi động lại tuần tự mà không cần đến các dịch vụ bên ngoài như Nginx hoặc HAProxy.

SQLite được nâng cấp cho môi trường sản xuất

Rails 8 cải thiện đáng kể hỗ trợ SQLite trong môi trường sản xuất. Connection pooling, chế độ WAL và khả năng đồng thời được nâng cao giúp SQLite trở thành lựa chọn khả thi cho các ứng dụng quy mô nhỏ và vừa. Kết hợp với Solid Trifecta, một máy chủ duy nhất có thể vận hành toàn bộ ứng dụng Rails 8 hoàn toàn trên SQLite mà không cần bất kỳ máy chủ cơ sở dữ liệu bên ngoài nào.

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

Cấu hình này vận hành toàn bộ ứng dụng từ bốn tập tin SQLite. Kamal gắn thư mục lưu trữ dưới dạng volume cố định, đảm bảo dữ liệu được bảo toàn qua các lần khởi động lại container.

Nâng cấp từ Rails 7 lên Rails 8

Quy trình nâng cấp từ Rails 7.2 lên Rails 8.0 diễn ra thuận lợi, với điều kiện ứng dụng đã xử lý các cảnh báo ngừng hỗ trợ trước đó. Các ứng dụng đang chạy Rails 7.0 hoặc 7.1 cần nâng cấp từng bước: từ 7.0 lên 7.1, sau đó lên 7.2, và cuối cùng lên 8.0.

Danh sách kiểm tra trước khi nâng cấp

Rails 8 yêu cầu Ruby 3.2 trở lên. Cần kiểm tra phiên bản Ruby đang sử dụng, đảm bảo bộ test vượt qua trên Rails 7.2 và xác nhận tính tương thích của các gem thông qua RailsBump trước khi bắt đầu nâng cấp.

Bước 1: Cập nhật các phụ thuộc

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

Bước 2: Chạy tác vụ cập nhật

bash
bin/rails app:update

Lệnh này cập nhật các tập tin cấu hình theo các giá trị mặc định của Rails 8. Điều quan trọng là phải xem xét từng thay đổi bằng git diff. Các thay đổi đáng chú ý bao gồm giá trị mặc định mới của Regexp.timeout (1 giây), hành vi thay đổi của db:migrate (tải schema cho cơ sở dữ liệu mới) và cấu hình Propshaft.

Bước 3: Xử lý việc sắp xếp lại schema

Rails 8 sắp xếp lại các cột trong schema.rb để phản ánh thứ tự thực tế của các cột trong cơ sở dữ liệu. Nên chạy lệnh dump schema ngay lập tức để tách biệt thay đổi mang tính hình thức này khỏi các thay đổi migration thực sự:

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

Bước 4: Áp dụng các tính năng mới từng bước

Solid Trifecta, Propshaft và bộ sinh mã xác thực đều là tùy chọn đối với các ứng dụng hiện có. Nên áp dụng từng tính năng một khi phiên bản nâng cấp chính đã ổn định:

  1. Thay thế adapter xử lý tác vụ bằng Solid Queue
  2. Chuyển bộ nhớ đệm sang Solid Cache
  3. Chuyển Action Cable sang Solid Cable (nếu áp dụng)
  4. Đánh giá việc chuyển pipeline xử lý tài nguyên sang Propshaft

Bước 5: Hiện đại hóa cách xử lý tham số

Thay thế các lời gọi params.require.permit bằng params.expect trong toàn bộ các controller. Thay đổi này là tùy chọn nhưng được khuyến nghị mạnh mẽ để có được việc xác thực tham số chắc chắn hơn.

Rails 8.1: Continuable Jobs và CI tích hợp

Rails 8.1, được phát hành vào tháng 10 năm 2025, tiếp nối nền tảng của Rails 8 với hai tính năng nổi bật. Continuable Jobs (ActiveJob::Continuable) chia các tác vụ kéo dài thành các bước có thể tiếp tục tự động. Nếu máy chủ khởi động lại giữa chừng nhập dữ liệu, tác vụ sẽ tiếp tục chính xác tại nơi đã dừng thay vì bắt đầu lại từ đầu.

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 cũng giới thiệu cấu hình CI tích hợp và khả năng render Markdown tích hợp, tiếp tục giảm thiểu các phụ thuộc bên ngoài.

Kết luận

Rails 8 đại diện cho một bước ngoặt quan trọng trong triết lý của framework, ưu tiên sự đơn giản trong vận hành mà không hy sinh tính năng. Các điểm chính cần ghi nhớ:

  • Solid Trifecta (Queue, Cache, Cable) loại bỏ Redis khỏi danh sách phụ thuộc bắt buộc cho xử lý tác vụ, bộ nhớ đệm và WebSocket
  • Bộ sinh mã xác thực tích hợp cung cấp nền tảng cho xác thực dựa trên phiên làm việc mà không cần gem bên ngoài
  • params.expect thay thế params.require.permit bằng cách xử lý tham số nghiêm ngặt và an toàn hơn
  • Propshaft thay thế Sprockets làm pipeline xử lý tài nguyên mặc định, ủy quyền việc đóng gói cho các công cụ hiện đại
  • Kamal 2 và Thruster cho phép triển khai không gián đoạn mà không cần Nginx hay Capistrano
  • Việc nâng cấp từ Rails 7.2 được thực hiện từng bước: cập nhật phụ thuộc, chạy app:update và áp dụng từng tính năng mới dần dần
  • Rails 8.1 bổ sung Continuable Jobs và CI tích hợp cho các đội ngũ muốn giảm thiểu công cụ bên ngoài

Bắt đầu luyện tập!

Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.

Thẻ

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

Chia sẻ

Bài viết liên quan