Ruby on Rails 8: Fitur Baru dan Panduan Migrasi Lengkap 2026

Rails 8 memperkenalkan Solid Trifecta, autentikasi bawaan, Kamal 2, dan Propshaft. Panduan lengkap dengan contoh kode serta langkah migrasi dari Rails 7.

Ilustrasi fitur baru Ruby on Rails 8 dan panduan migrasi

Ruby on Rails 8 menandai babak baru dalam evolusi framework yang telah mendefinisikan ulang pengembangan web sejak 2004. Dirilis pada November 2024 dan diperkuat dengan Rails 8.1 pada Oktober 2025, siklus versi ini menghilangkan sejumlah dependensi eksternal yang selama bertahun-tahun membebani arsitektur produksi. Redis, Sprockets, Capistrano -- semuanya kini menjadi opsional berkat alternatif terintegrasi yang didukung langsung oleh basis data relasional. Perubahan fundamental ini menyederhanakan deployment secara signifikan, memangkas biaya infrastruktur, dan menurunkan hambatan teknis bagi proyek berskala menengah.

Ringkasan Rails 8

Rails 8 menggantikan Redis dengan Solid Trifecta (Solid Queue, Solid Cache, Solid Cable), menyertakan generator autentikasi bawaan, mengadopsi Propshaft sebagai asset pipeline default, serta mengintegrasikan Kamal 2 untuk deployment tanpa downtime. Ruby 3.2 atau versi yang lebih baru merupakan persyaratan minimum.

Solid Trifecta: Infrastruktur Berbasis Basis Data

Sebelum Rails 8, setiap aplikasi produksi yang serius bergantung pada Redis untuk tiga fungsi kritis: background jobs, caching, dan pub/sub WebSocket. Solid Trifecta menggantikan ketiga komponen tersebut dengan adapter yang kompatibel dengan PostgreSQL, MySQL, dan SQLite, dikendalikan langsung oleh basis data relasional yang sudah ada.

Keuntungan operasional yang diperoleh bersifat langsung: tidak perlu lagi menyediakan, memantau, dan memelihara instance Redis terpisah. Kompromi terletak pada performa mentah -- Redis tetap lebih cepat dalam skenario throughput sangat tinggi. Namun untuk sebagian besar aplikasi, adapter berbasis basis data menawarkan performa yang lebih dari memadai. Basecamp, aplikasi andalan 37signals, menjalankan Solid Cache sebesar 10 TB di lingkungan produksi dengan retensi 60 hari.

Solid Queue: Background Jobs Tanpa Redis

Solid Queue menggantikan Sidekiq, Resque, atau Delayed Job sebagai backend Active Job yang didukung basis data. Sistem ini memanfaatkan FOR UPDATE SKIP LOCKED pada PostgreSQL 9.5+ dan MySQL 8.0+, dengan mekanisme fallback untuk 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 memungkinkan Solid Queue berjalan bersamaan dengan web server di lingkungan development, sehingga tidak perlu menjalankan proses terpisah:

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

Solid Queue mendukung recurring jobs, concurrency controls, serta fitur-fitur lanjutan seperti jeda dan lanjutkan per antrian. Untuk aplikasi yang memproses kurang dari 10.000 job per menit, sistem ini mampu menangani beban tanpa kendala.

Solid Cache dan Solid Cable

Solid Cache menyimpan fragment HTML yang di-cache ke dalam basis data alih-alih Memcached atau Redis. Penyimpanan berbasis disk (SSD/NVMe) memiliki biaya yang jauh lebih rendah dibandingkan RAM, sehingga memungkinkan pool cache yang jauh lebih besar dengan durasi retensi yang lebih panjang.

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

Solid Cable menggantikan adapter pub/sub Redis pada Action Cable. Pesan WebSocket ditulis ke dalam tabel dan di-poll setiap 100 ms secara default. Hasilnya adalah komunikasi mendekati real-time untuk sebagian besar kasus penggunaan, dengan pembersihan otomatis pesan setelah 24 jam.

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

Generator Autentikasi Bawaan

Rails 8 menyertakan generator autentikasi yang menghasilkan scaffolding untuk login, logout, dan reset password. Tidak diperlukan gem eksternal untuk autentikasi dasar.

bash
# Generate the authentication scaffolding
bin/rails generate authentication

Perintah ini membuat model User, model Session, SessionsController, PasswordsController, dan concern Authentication. Kode yang dihasilkan menggunakan has_secure_password dengan bcrypt serta menyertakan pembatasan percobaan login (10 percobaan setiap 3 menit per alamat 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

Reset password menggunakan signed token dengan masa kedaluwarsa yang dihasilkan oleh has_secure_password, bukan token yang disimpan di basis data. Generator ini secara sengaja tidak menyertakan fitur registrasi, verifikasi email, maupun autentikasi sosial. Kode yang dihasilkan merupakan fondasi yang kokoh untuk dikembangkan lebih lanjut, bukan pengganti lengkap Devise.

Cakupan Generator

Generator bawaan mencakup login, logout, dan reset password. Registrasi pengguna, verifikasi email, OAuth, dan autentikasi multi-faktor perlu ditambahkan secara manual atau melalui gem seperti Authentication Zero.

Penanganan Parameter yang Lebih Aman dengan params.expect

Rails 8 memperkenalkan params.expect, alternatif yang lebih ketat dibandingkan pola tradisional params.require.permit. Metode baru ini melemparkan exception ketika key tidak ditemukan, alih-alih mengembalikan nil secara diam-diam.

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

Metode expect memastikan bahwa key :user ada dan hanya mengandung atribut yang diizinkan. Jika key tidak ditemukan, metode ini langsung melemparkan ActionController::ParameterMissing, sehingga mencegah error tersembunyi di tahapan selanjutnya dalam alur eksekusi.

Propshaft: Asset Pipeline Default yang Baru

Propshaft menggantikan Sprockets sebagai asset pipeline default. Jika Sprockets menangani kompilasi, minifikasi, dan fingerprinting dalam satu sistem monolitik, Propshaft berfokus secara eksklusif pada penyajian dan fingerprinting file statis.

Untuk bundling JavaScript, Propshaft mendelegasikan ke tool modern: esbuild, Vite, atau Bun. Pemrosesan CSS dilakukan melalui Tailwind CLI atau dart-sass. Hasilnya adalah asset pipeline yang lebih cepat, lebih dapat diprediksi, dan selaras dengan ekosistem frontend masa kini.

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

Aplikasi yang sudah ada dan menggunakan Sprockets dapat terus menggunakannya tanpa kendala. Proses migrasi terdiri dari menghapus directive khusus Sprockets (//= require) dan mengadopsi import maps atau bundler JavaScript.

Siap menguasai wawancara Ruby on Rails Anda?

Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.

Kamal 2 dan Thruster: Deployment Tanpa Downtime

Rails 8 telah dikonfigurasi dengan Kamal 2, sebuah tool deployment yang mampu mengubah server Linux kosong menjadi server produksi hanya dengan satu perintah. Kamal 2 menggantikan Traefik dengan Kamal Proxy, reverse proxy yang dirancang khusus untuk kebutuhan ini.

bash
kamal setup
kamal deploy

Thruster ditempatkan di antara Kamal Proxy dan Puma. Komponen ini menyediakan akselerasi X-Sendfile untuk pengunduhan file, kompresi otomatis asset (gzip/brotli), dan dukungan HTTP/2. Dockerfile yang dihasilkan oleh Rails 8 sudah menyertakan Thruster secara default.

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

Stack teknologi ini (Kamal 2 + Kamal Proxy + Thruster + Puma) menangani terminasi SSL, deployment tanpa downtime, dan rolling restart tanpa memerlukan layanan eksternal seperti Nginx atau HAProxy.

Peningkatan SQLite untuk Produksi

Rails 8 secara signifikan meningkatkan dukungan SQLite di lingkungan produksi. Connection pooling, mode WAL, dan peningkatan concurrency menjadikan SQLite layak digunakan untuk aplikasi berskala kecil hingga menengah. Dikombinasikan dengan Solid Trifecta, satu server tunggal dapat menjalankan aplikasi Rails 8 sepenuhnya menggunakan SQLite, tanpa server basis data eksternal sama sekali.

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

Konfigurasi ini menjalankan seluruh stack aplikasi dari empat file SQLite. Kamal memasang direktori penyimpanan sebagai volume persisten, menjamin data tetap utuh saat container di-restart.

Migrasi dari Rails 7 ke Rails 8

Migrasi dari Rails 7.2 ke Rails 8.0 berjalan lancar selama aplikasi telah menangani semua deprecation warning terlebih dahulu. Aplikasi yang masih menggunakan Rails 7.0 atau 7.1 perlu melakukan upgrade bertahap: dari 7.0 ke 7.1, kemudian dari 7.1 ke 7.2, dan terakhir dari 7.2 ke 8.0.

Prasyarat Sebelum Upgrade

Rails 8 mensyaratkan Ruby 3.2 atau versi yang lebih baru. Pastikan versi Ruby yang terinstal sudah sesuai, test suite lulus sepenuhnya di Rails 7.2, dan periksa kompatibilitas gem melalui RailsBump sebelum memulai proses upgrade.

Langkah 1: Memperbarui Dependensi

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

Langkah 2: Menjalankan Task Pembaruan

bash
bin/rails app:update

Perintah ini memperbarui file-file konfigurasi ke nilai default Rails 8. Sangat penting untuk meninjau setiap perubahan menggunakan git diff. Perubahan penting meliputi nilai default baru Regexp.timeout (1 detik), perubahan perilaku db:migrate (memuat schema pada basis data kosong), dan konfigurasi Propshaft.

Langkah 3: Menangani Reorganisasi Schema

Rails 8 mengurutkan ulang kolom di schema.rb agar mencerminkan urutan kolom yang sebenarnya di basis data. Disarankan untuk menjalankan schema dump segera agar perubahan kosmetik ini terpisah dari perubahan migrasi yang sesungguhnya:

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

Langkah 4: Mengadopsi Fitur Baru Secara Bertahap

Solid Trifecta, Propshaft, dan generator autentikasi bersifat opsional untuk aplikasi yang sudah ada. Sebaiknya fitur-fitur tersebut diadopsi secara individual setelah upgrade utama sudah stabil:

  1. Mengganti adapter job ke Solid Queue
  2. Memindahkan cache store ke Solid Cache
  3. Memigrasi Action Cable ke Solid Cable (jika digunakan)
  4. Mengevaluasi migrasi asset pipeline ke Propshaft

Langkah 5: Memodernisasi Penanganan Parameter

Mengganti seluruh pemanggilan params.require.permit dengan params.expect di semua controller. Perubahan ini bersifat opsional tetapi sangat dianjurkan untuk mendapatkan validasi parameter yang lebih ketat.

Rails 8.1: Continuable Jobs dan CI Terintegrasi

Rails 8.1, yang dirilis pada Oktober 2025, melanjutkan fondasi yang dibangun oleh Rails 8 dengan dua fitur utama. Continuable Jobs (ActiveJob::Continuable) memecah tugas berdurasi panjang menjadi langkah-langkah yang dilanjutkan secara otomatis. Jika server mengalami restart di tengah proses impor, tugas tersebut akan dilanjutkan tepat dari posisi terakhir alih-alih memulai ulang dari awal.

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 juga memperkenalkan konfigurasi CI terintegrasi dan rendering Markdown bawaan, semakin mengurangi ketergantungan pada komponen eksternal.

Kesimpulan

Rails 8 merepresentasikan pergeseran fundamental dalam filosofi framework, mengutamakan kesederhanaan operasional tanpa mengorbankan fungsionalitas. Berikut poin-poin penting yang perlu diperhatikan:

  • Solid Trifecta (Queue, Cache, Cable) mengeliminasi Redis sebagai dependensi wajib untuk background jobs, caching, dan WebSocket
  • Generator autentikasi bawaan menyediakan fondasi autentikasi berbasis session tanpa gem pihak ketiga
  • params.expect menggantikan params.require.permit dengan penanganan parameter yang lebih ketat dan lebih aman
  • Propshaft menggantikan Sprockets sebagai asset pipeline default, mendelegasikan bundling ke tool modern
  • Kamal 2 dan Thruster memungkinkan deployment tanpa downtime tanpa memerlukan Nginx atau Capistrano
  • Migrasi dari Rails 7.2 bersifat inkremental: memperbarui dependensi, menjalankan app:update, dan mengadopsi fitur baru secara bertahap
  • Rails 8.1 menambahkan Continuable Jobs dan CI terintegrasi bagi tim yang ingin mengurangi ketergantungan pada tool eksternal

Mulai berlatih!

Uji pengetahuan Anda dengan simulator wawancara dan tes teknis kami.

Tag

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

Bagikan

Artikel terkait