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.

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.
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.
# 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 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:
# 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.
# config/environments/production.rb
config.cache_store = :solid_cache_storeSolid 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ờ.
# config/cable.yml
production:
adapter: solid_cable
polling_interval: 0.1
keep_messages_around_for: 1.dayBộ 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.
# Generate the authentication scaffolding
bin/rails generate authenticationLệ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).
# 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
endChứ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.
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.
# 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])
endPhươ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.
# Gemfile (Rails 8 default)
gem "propshaft"
# No configuration needed for basic usage
# Assets in app/assets are served and fingerprinted automaticallyCá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.
# Deploy to a fresh server
kamal setup
# Subsequent deployments
kamal deployThruster 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.
# 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.
# 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.sqlite3Cấ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.
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
# Gemfile
gem "rails", "~> 8.0"bundle update railsBước 2: Chạy tác vụ cập nhật
bin/rails app:updateLệ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ự:
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:
- Thay thế adapter xử lý tác vụ bằng Solid Queue
- Chuyển bộ nhớ đệm sang Solid Cache
- Chuyển Action Cable sang Solid Cable (nếu áp dụng)
- Đá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.
# 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 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.expectthay thếparams.require.permitbằ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:updatevà á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ẻ
Chia sẻ
