# 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. - Published: 2026-04-17 - Updated: 2026-04-17 - Author: SharpSkill - Tags: ruby-on-rails, rails-8, tutorial, migration, solid-queue, solid-cache, authentication - Reading time: 9 min --- 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. ## 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 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/vi/blog/ruby-on-rails/ruby-on-rails-8-new-features-migration-guide