Menginstall Rails 8.1.x, membuat project pertama dengan rails new, menjelajahi struktur direktori MVC, menjalankan bin/rails server dan bin/rails console, serta membangun scaffold CRUD pertama

Setelah di episode 2 kalian memahami arsitektur MVC Rails, episode 3 adalah momen hands-on pertama: menginstall Rails dan membangun project nyata. Di sinilah konsep abstrak menjadi struktur folder yang bisa kalian sentuh, jalankan, dan jelajahi.
Mengapa episode ini krusial? Karena struktur direktori Rails adalah manifestasi fisik dari konvensi yang sudah kita bahas — begitu kalian paham di mana file diletakkan dan peran tiap folder, kalian bisa masuk ke project Rails mana pun dan langsung tahu cara navigasinya. Episode ini juga memberi kalian dua command yang akan dipakai hampir setiap hari: bin/rails server dan bin/rails console.
Rails diinstall sebagai gem global (atau per-user). Pastikan Bundler sudah ada lalu install Rails 8.1.x:
gem install rails -v "~> 8.1.0"
rails --versionrails --version harus menampilkan Rails 8.1.3.1 atau setidaknya versi 8.1.x terbaru. Jika kalian memakai rbenv, gem diinstall per-versi Ruby — pastikan rbenv global mengarah ke Ruby 3.4.x yang sama seperti di episode 0.
Sekarang buat project blog. Kita pilih SQLite dulu agar bisa langsung jalan tanpa konfigurasi database:
rails new blog --database=sqlite3
cd blogUntuk project yang nanti memakai PostgreSQL, gunakan --database=postgresql — kita akan melakukannya di episode 5. Opsi umum lainnya: --api (API only, episode 15), --css=bootstrap, dan --skip-javascript.
Inilah peta direktori yang paling sering kalian sentuh:
blog/
├── app/ # semua kode aplikasi
│ ├── controllers/ # controllers (MVC)
│ ├── models/ # models & Active Record
│ ├── views/ # templates (ERB, partials)
│ ├── jobs/ # Active Job
│ ├── mailers/ # Action Mailer
│ ├── channels/ # Action Cable
│ ├── helpers/ # view helpers
│ ├── assets/ # CSS, JS, images
│ └── javascript/ # Stimulus controllers (Hotwire)
├── config/ # routes, environments, database.yml
├── db/ # migrations, schema.rb, seeds.rb
├── test/ # Minitest & fixtures
├── public/ # file statis
└── Gemfile # dependencySemua kode kalian tinggal di app/; config/ memegang pengaturan (termasuk config/routes.rb yang dibahas di episode 4); db/ memegang riwayat perubahan schema (episode 6). Gemfile.lock di root memastikan dependency reproducible.
Note
Jangan bingung dengan banyaknya folder di app/. Saat kalian menambahkan fitur (model, mailer, job, channel), Rails generator selalu menempatkan file di folder yang benar secara otomatis — kalian cukup tahu di mana menemukannya saat ingin membaca kode.
bin/rails serverServer berjalan di http://localhost:3000 dengan auto-reload: perubahan kode langsung terlihat tanpa restart. Inilah kenapa bin/rails (bukan rails langsung) lebih disarankan — ia memakai versi gem dari project.
bin/rails consoleConsole adalah IRB yang me-load seluruh aplikasi — kalian bisa memanggil model, memeriksa route, dan mengeksekusi kode apa pun. Ini alat debugging utama sepanjang series:
> Rails.application.routes.routes.size
> puts ActiveRecord::Base.connection.adapter_nameGenerator (bin/rails g) adalah mesin konvensi: g model, g controller, g migration, g scaffold, dan g job — cek daftar lengkapnya dengan bin/rails generate --help. Kita akan pakai semuanya sepanjang series.
Sekarang mari membangun CRUD lengkap hanya dengan satu perintah — ini demonstrasi paling jelas dari kekuatan konvensi Rails:
bin/rails generate scaffold Post title:string body:text
bin/rails db:migrate
bin/rails serverBuka http://localhost:3000/posts. Kalian sudah punya halaman index, show, new, edit, delete, dan form valid — semua dari satu generator. Yang dihasilkan generator ini:
app/controllers/posts_controller.rb
app/models/post.rb
app/views/posts/*.erb
db/migrate/*_create_posts.rb
test/models/post_test.rb
config/routes.rb # + resources :postsMari kita periksa controller yang dihasilkan:
class PostsController < ApplicationController
before_action :set_post, only: %i[show edit update destroy]
def index
@posts = Post.all
end
def show
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: "Post was successfully created."
else
render :new, status: :unprocessable_entity
end
end
private
def set_post
@post = Post.find(params[:id])
end
def post_params
params.expect(post: [:title, :body])
end
endPerhatikan pola yang akan berulang di hampir semua controller: 7 action RESTful (index, show, new, create, edit, update, destroy), before_action untuk menyiapkan @post, dan params.expect untuk strong parameters. Detail before_action dan render/redirect kita bedah di episode 4, strong params di episode 8.
Warning
Jangan menjalankan bin/rails generate scaffold pada aplikasi produksi tanpa memikirkan UI dan validasi bisnisnya. Scaffold adalah titik awal pembelajaran yang bagus, tapi di dunia nyata fitur biasanya dibuat dengan generator model/controller yang lebih terarah.
Console adalah cara terbaik memahami apa yang terjadi di balik layar. Coba tambahkan data manual:
post = Post.new(title: "Hello Rails", body: "Episode 3")
post.save
Post.count
Post.find_by(title: "Hello Rails")post.save mengembalikan true jika tervalidasi, lalu baris dengan Post.count memverifikasi data masuk ke database SQLite. Dari sini kalian melihat bahwa model Rails adalah objek Ruby biasa yang di-persist ke database oleh Active Record.
Episode 3 adalah jembatan dari teori ke praktik: kalian menginstall Rails 8.1.x, membuat project blog dengan rails new, memahami peta direktori MVC, menjalankan bin/rails server dan bin/rails console, serta membangun CRUD lengkap dengan scaffold dalam hitungan detik.
Inti yang harus dibawa pulang:
gem install rails; cek dengan rails --version.rails new blog --database=sqlite3 membuat project lengkap dengan struktur MVC.app/ memegang semua kode; config/ dan db/ memegang pengaturan & schema.bin/rails server dan bin/rails console adalah dua command harian utama.bin/rails generate scaffold menghasilkan CRUD lengkap + pola 7 action RESTful.Di episode 4 selanjutnya kita akan membedah routing & controllers — resources, nested routes, member/collection, constraints, dan namespaces, plus strong params, render/redirect, flash, dan filters before_action. Pastikan project blog kalian sudah berjalan, karena praktik episode ini berkelanjutan!