Episode ini membedah dunia web Ruby: interface Rack, web server Puma yang thread-based, middleware, framework Sinatra untuk API cepat, gambaran Rails 8.x full-stack, serta membangun REST API dengan routing, JSON, params, dan error handling.

Di episode 13 kalian membuat socket server sederhana. Sekarang saatnya melompat ke dunia nyata: web framework yang menangani routing, params, JSON, dan error handling secara profesional. Di sinilah Ruby benar-benar bersinar — ekosistem web-nya adalah salah satu yang paling produktif di dunia.
Episode 14 ini membedah lapisan demi lapisan: interface Rack yang menjadi standar web Ruby, web server Puma yang thread-based, middleware, framework mikro Sinatra, gambaran Rails 8.x untuk aplikasi besar, lalu praktik membangun REST API dengan routing, JSON response, params, dan error handling.
Hampir semua web framework Ruby berdiri di atas Rack — antarmuka sederhana yang menjembatani aplikasi dan web server. Sebuah aplikasi Rack hanyalah objek yang merespons call(env) dengan array berisi tiga elemen: status code, header hash, dan body:
app = proc do |env|
[200, { "content-type" => "text/plain" }, ["Halo Rack"]]
end
run appFile di atas adalah config.ru — kependekan dari rackup. run app memberitahu Rack aplikasi mana yang dijalankan. Karena antarmukanya sangat kecil, kalian bisa menguji middleware atau prototipe API dengan Rack murni sebelum masuk framework.
Puma adalah web server default ekosistem Ruby — thread-based, artinya satu proses Puma melayani banyak request secara bersamaan melalui kumpulan thread. Ia jauh lebih efisien daripada model satu proses per request. Jalankan dengan rackup atau langsung:
gem install rack puma
rackuprackup membaca config.ru, menjalankan aplikasi di atas server Puma, dan melayani di port 4567. Middleware adalah komponen yang membungkus aplikasi — menangani logging, otentikasi, atau kompresi sebelum aplikasi dipanggil. Ruby on Rails dan Sinatra keduanya memakai lapisan middleware Rack ini.
Sinatra adalah framework mikro yang sempurna untuk API dan service kecil. DSL-nya memetakan method HTTP ke block secara langsung, dengan params berisi seluruh input — dari query string, body form, hingga segment URL:
require "sinatra"
require "json"
get "/" do
"Halo dari Sinatra"
end
get "/pengguna/:id" do
{ id: params["id"], nama: "Arman" }.to_json
endget "/pengguna/:id" do ... end mendefinisikan route yang menangkap segment :id. Di dalam block, params["id"] mengambil nilai segment tersebut. .to_json mengubah hash menjadi string JSON. Tambahkan gem "sinatra" dan gem "puma" ke Gemfile, lalu jalankan:
gem install sinatra
ruby app.rbruby app.rb menjalankan Sinatra dengan server bawaan (atau Puma bila ada). Server melayani di localhost:4567. Sinatra bisa dijalankan tanpa Bundler untuk prototipe, tapi untuk project nyata selalu pakai Bundler seperti di episode 12.
API yang baik menangani error secara eksplisit. Sinatra menyediakan handler not_found untuk 404 dan error untuk exception yang tidak tertangkap:
not_found do
{ error: "resource tidak ditemukan" }.to_json
end
error do
{ error: "terjadi kesalahan server" }.to_json
endnot_found do ... end mengembalikan JSON saat route tidak cocok, dan error do ... end menangkap exception dan mengembalikan 500. Untuk status khusus, gunakan helper status 201 sebelum response — misalnya saat membuat resource baru.
Untuk aplikasi web besar — dengan autentikasi, background job, dan banyak model — Rails 8.x adalah pilihan utama. Rails menyediakan solusi full-stack terintegrasi: ActiveRecord untuk database, Action Cable untuk realtime, dan solid-cache serta solid-queue sebagai lapisan cache dan antrian bawaan yang menggantikan Redis untuk banyak kasus. Kamal menangani deployment ke server tanpa orchestrator kompleks, dan Propshaft menjadi asset pipeline modern.
Membuat project Rails sama cepatnya dengan Sinatra:
gem install rails
rails new blog --database=postgresql
cd blog
bin/rails serverrails new blog --database=postgresql membuat project lengkap dengan struktur MVC, bin/rails server menjalankannya di port 3000. Rails 8.x membuat banyak hal "just work" — itulah alasan ia tetap framework backend terpopuler di ekosistem Ruby.
Merangkai semua: sebuah resource API dengan Sinatra yang menangani CRUD sederhana. Routing dipisahkan per method HTTP sesuai konvensi REST:
get "/tugas" do
{ tugas: ["belajar ruby", "buat api"] }.to_json
end
post "/tugas" do
judul = params["judul"]
{ status: "dibuat", judul: judul }.to_json
endpost "/tugas" do ... end menangani request POST yang mengirim data — params["judul"] mengambil field dari body form atau JSON. Pola get, post, put, delete per route inilah konvensi REST yang sama dipakai Rails dengan resources.
Untuk production, pertimbangkan: limitasi body request untuk mencegah payload raksasa, logging request via middleware, dan response JSON yang konsisten bentuknya — misalnya selalu { error: "..." } pada kegagalan. Konsistensi ini membuat client API mudah menangani semua kemungkinan. Kita lanjutkan aspek keamanan secara menyeluruh di episode 15.
Info
Pilih Sinatra ketika service kalian kecil dan fokus (API gateway, webhook receiver). Pilih Rails ketika kalian butuh full-stack: autentikasi, admin panel, background job, dan tim yang berkembang. Keduanya berdiri di atas Rack, jadi prinsip yang dipelajari tetap sama.
Episode 14 membawa Ruby ke ranah aplikasi nyata: interface Rack yang sederhana, web server Puma yang thread-based, middleware, Sinatra untuk API cepat, gambaran Rails 8.x full-stack, dan praktik membangun REST API dengan routing, JSON, params, serta error handling.
Inti yang harus dibawa pulang:
call(env) yang mengembalikan status, headers, dan body.params sebagai input.not_found dan error di Sinatra menangani 404 dan 500 dengan JSON.Di episode 15 selanjutnya kita akan membahas security best practices — kerentanan umum seperti SQL injection, command injection, XSS, dan unsafe deserialization, alat keamanan Brakeman dan bundler-audit, serta penanganan secrets melalui environment variables. Keamanan bukan fitur tambahan, melainkan bagian inti pengembangan.