<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://whdzera.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://whdzera.com/" rel="alternate" type="text/html" /><updated>2026-05-12T10:25:29+00:00</updated><id>https://whdzera.com/feed.xml</id><title type="html">whdzera</title><subtitle>Temukan berbagai tulisan menarik seputar teknologi. Blog ini dibuat sebagai ruang berbagi ide, pengalaman, dan pengetahuan yang bisa bermanfaat untuk siapa saja. Yuk, jelajahi dan temukan sesuatu yang baru di setiap postingannya!</subtitle><entry><title type="html">Mengenal Migration dan Schema di Rails</title><link href="https://whdzera.com/blog/migration-schema-rails" rel="alternate" type="text/html" title="Mengenal Migration dan Schema di Rails" /><published>2026-05-04T00:00:00+00:00</published><updated>2026-05-04T00:00:00+00:00</updated><id>https://whdzera.com/blog/migration-schema-rails</id><content type="html" xml:base="https://whdzera.com/blog/migration-schema-rails"><![CDATA[<p>Migration dan Schema adalah fondasi manajemen database di Rails. Kalau kamu baru di Rails, memahami kedua konsep ini adalah langkah wajib sebelum menyentuh model atau controller.</p>

<hr />

<h2 id="apa-itu-migration">Apa Itu Migration?</h2>

<p>Migration adalah cara Rails mengelola perubahan struktur database. Setiap migration adalah file yang mendeskripsikan: tabel apa yang dibuat, kolom apa yang ditambahkan, atau index apa yang perlu diubah.</p>

<p><strong>Inti nya:</strong></p>

<ul>
  <li>Migration = versioning untuk database</li>
  <li>Setiap perubahan tercatat dan reversible</li>
  <li>Team bisa migrate ke state yang sama dengan mudah</li>
</ul>

<hr />

<h2 id="schema---snapshot-struktur-database">Schema - Snapshot Struktur Database</h2>

<p>Schema adalah representasi current state struktur database kamu. File <code class="language-plaintext highlighter-rouge">db/schema.rb</code> adalah snapshot semua tabel, kolom, dan relasi yang ada.</p>

<p><strong>Perbedaan penting:</strong></p>

<ul>
  <li>Migration = history/log perubahan</li>
  <li>Schema = state saat ini</li>
</ul>

<hr />

<h2 id="cara-kerja-migration">Cara Kerja Migration</h2>

<p>Rails menjalankan migration secara berurutan berdasarkan timestamp. Setiap migration punya:</p>

<ul>
  <li><strong>Up method</strong>: apa yang dilakukan (create, add, remove)</li>
  <li><strong>Down method</strong>: bagaimana cara rollback</li>
</ul>

<p>Rails juga menyimpan tabel <code class="language-plaintext highlighter-rouge">schema_migrations</code> untuk tracking migration mana yang sudah dijalankan.</p>

<hr />

<h2 id="common-migration-operations">Common Migration Operations</h2>

<table>
  <thead>
    <tr>
      <th>Operation</th>
      <th>Fungsi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">create_table</code></td>
      <td>Buat tabel baru</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">add_column</code></td>
      <td>Tambah kolom</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">remove_column</code></td>
      <td>Hapus kolom</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">add_index</code></td>
      <td>Tambah index</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rename_column</code></td>
      <td>Rename kolom</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">change_column</code></td>
      <td>Ubah tipe kolom</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="tipe-data-yang-umum-digunakan">Tipe Data yang Umum Digunakan</h2>

<table>
  <thead>
    <tr>
      <th>Tipe Rails</th>
      <th>Tipe Database</th>
      <th>Penggunaan</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">string</code></td>
      <td>VARCHAR</td>
      <td>Nama, email</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">text</code></td>
      <td>TEXT</td>
      <td>Deskripsi panjang</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">integer</code></td>
      <td>INT</td>
      <td>Counter, ID</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">decimal</code></td>
      <td>DECIMAL</td>
      <td>Uang, presisi angka</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">boolean</code></td>
      <td>BOOLEAN</td>
      <td>True/false flags</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">date</code></td>
      <td>DATE</td>
      <td>Tanggal saja</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">datetime</code></td>
      <td>TIMESTAMP</td>
      <td>Tanggal + waktu</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">references</code></td>
      <td>FOREIGN KEY</td>
      <td>Relasi antar tabel</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="schema-vs-struktur-database">Schema vs Struktur Database</h2>

<p>Schema di Rails bukan sekadar output SQL. Ini adalah DSL (Domain Specific Language) yang readable dan version-controlled.</p>

<p><strong>Keuntungan schema.rb:</strong></p>

<ul>
  <li>Bisa di-generate ulang dari migration</li>
  <li>Tidak perlu akses langsung ke database untuk lihat struktur</li>
  <li>Git-friendly: bisa diff, merge, review</li>
</ul>

<hr />

<p>Pahami migration bukan sebagai “rumit,” tapi sebagai sistem versioning untuk database yang membuat collaboration jadi jauh lebih aman.</p>

<blockquote>
  <p>Migration dan Schema adalah evidence bahwa Rails memperlakukan database sebagai partner, bukan sekadar storage.</p>
</blockquote>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Migration dan Schema adalah fondasi manajemen database di Rails. Kalau kamu baru di Rails, memahami kedua konsep ini adalah langkah wajib sebelum menyentuh model atau controller.]]></summary></entry><entry><title type="html">Rails vs Django vs Laravel - Siapa yang lebih baik?</title><link href="https://whdzera.com/blog/rails-django-laravel" rel="alternate" type="text/html" title="Rails vs Django vs Laravel - Siapa yang lebih baik?" /><published>2026-04-17T00:00:00+00:00</published><updated>2026-04-17T00:00:00+00:00</updated><id>https://whdzera.com/blog/rails-django-laravel</id><content type="html" xml:base="https://whdzera.com/blog/rails-django-laravel"><![CDATA[<p>saling adu framework adalah fenomena klasik yang sering muncul di kalangan developer. Jawaban jujur <strong>tidak ada yang secara objektif “lebih baik.”</strong> Yang ada adalah mana yang lebih cocok untuk situasi dan kebutuhan spesifik kamu.</p>

<hr />

<h2 id="perbandingan-langsung">Perbandingan Langsung</h2>

<table>
  <thead>
    <tr>
      <th>Aspek</th>
      <th>Rails (Ruby)</th>
      <th>Django (Python)</th>
      <th>Laravel (PHP)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Bahasa</strong></td>
      <td>Ruby</td>
      <td>Python</td>
      <td>PHP</td>
    </tr>
    <tr>
      <td><strong>Gaya Penulisan</strong></td>
      <td>Opinionated, konvensi kuat</td>
      <td>Opinionated, baterai included</td>
      <td>PHP modern, flexible</td>
    </tr>
    <tr>
      <td><strong>Ekosistem</strong></td>
      <td>Solid, mature</td>
      <td>Sangat besar (Python)</td>
      <td>Besar (PHP ecosystem)</td>
    </tr>
    <tr>
      <td><strong>Learning Curve</strong></td>
      <td>Sedang-Tinggi</td>
      <td>Rendah-Sedang</td>
      <td>Rendah</td>
    </tr>
    <tr>
      <td><strong>Startup Speed</strong></td>
      <td>Lambat</td>
      <td>Cepat</td>
      <td>Cepat</td>
    </tr>
    <tr>
      <td><strong>Performance</strong></td>
      <td>Baik</td>
      <td>Baik</td>
      <td>Cukup Baik</td>
    </tr>
    <tr>
      <td><strong>Deploy</strong></td>
      <td>Mudah</td>
      <td>Mudah</td>
      <td>Mudah</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="rails---untuk-yang-ingin-produktivitas-maksimal">Rails - Untuk Yang Ingin Produktivitas Maksimal</h2>

<p><strong>Kapan pilih Rails:</strong></p>

<ul>
  <li>Kamu ingin membangun MVP atau startup dengan cepat</li>
  <li>Kamu menghargai Convention over Configuration (CoC)</li>
  <li>Kamu nyaman dengan “Rails Way”</li>
</ul>

<p><strong>Kapan hindari Rails:</strong></p>

<ul>
  <li>Tim kamu sudah expert di Python/PHP</li>
  <li>Kamu tidak nyaman dengan Ruby syntax</li>
</ul>

<p><strong>Kesimpulan Rails:</strong>
Rails adalah framework yang sangat opinionated. Kalau kamu mengikuti Rails Way, semuanya terasa magical. Kalau tidak, frustrasi.</p>

<hr />

<h2 id="django---untuk-yang-ingin-python-power">Django - Untuk Yang Ingin Python Power</h2>

<p><strong>Kapan pilih Django:</strong></p>

<ul>
  <li>Kamu sudah proficient di Python</li>
  <li>Kamu butuh built-in admin panel</li>
  <li>Kamu membangun project berbasis data science/ML</li>
</ul>

<p><strong>Kapan hindari Django:</strong></p>

<ul>
  <li>Kamu butuh real-time features berat</li>
  <li>Kamu tidak suka ORM Django (meski ada alternatif)</li>
  <li>Project kamu sederhana dan tidak butuh “batteries included”</li>
</ul>

<p><strong>Kesimpulan Django:</strong>
Django sangat Pythonic eksplisit, readable, dan pragmatis. Admin panel built-in-nya adalah killer feature yang tidak ada duanya di Rails atau Laravel.</p>

<hr />

<h2 id="laravel---untuk-yang-ingin-php-modern">Laravel - Untuk Yang Ingin PHP Modern</h2>

<p><strong>Kapan pilih Laravel:</strong></p>

<ul>
  <li>Kamu familiar dengan PHP</li>
  <li>Kamu butuh ekosistem PHP yang massive</li>
  <li>Kamu mau sintaks yang elegan dan modern</li>
</ul>

<p><strong>Kapan hindari Laravel:</strong></p>

<ul>
  <li>Kamu punya trauma dengan PHP lawas</li>
  <li>Kamu butuh performa sangat tinggi untuk realtime apps</li>
  <li>Kamu benci dependency manager PHP (Composer) yang berat</li>
</ul>

<p><strong>Kesimpulan Laravel:</strong>
Laravel mengambil hal terbaik dari Rails dan mengemasnya dalam PHP. Eloquent ORM-nya elegant, Blade templating-nya powerful. Tapi performance-nya memang di bawah Rails dan Django.</p>

<hr />

<h2 id="pertanyaan">Pertanyaan</h2>

<p>Sebelum memilih, jawab pertanyaan ini:</p>

<ol>
  <li>
    <p><strong>Bahasa apa yang sudah kamu kuasai?</strong> Ini faktor terbesar. Framework terbaik adalah yang bahasanya kamu kuasai.</p>
  </li>
  <li>
    <p><strong>Seberapa cepat kamu perlu launch?</strong> Rails dan Laravel menang di sini untuk startup.</p>
  </li>
  <li>
    <p><strong>Apakah kamu butuh ML/Data integration?</strong> Django obvious winner.</p>
  </li>
  <li>
    <p><strong>Seberapa opinionated kamu?</strong> Rails paling strict, Laravel paling flexible.</p>
  </li>
  <li>
    <p><strong>Siapa target user kamu?</strong> Jika PHP hosting masih relevan untuk client, Laravel wins.</p>
  </li>
</ol>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<table>
  <thead>
    <tr>
      <th>Kebutuhan</th>
      <th>Winner</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Startup cepat + MVP</td>
      <td>Rails atau Laravel</td>
    </tr>
    <tr>
      <td>Data science / ML integration</td>
      <td>Django</td>
    </tr>
    <tr>
      <td>Legacy PHP migration</td>
      <td>Laravel</td>
    </tr>
    <tr>
      <td>Clean code + maintainability</td>
      <td>Django</td>
    </tr>
    <tr>
      <td>Maximum convention</td>
      <td>Rails</td>
    </tr>
    <tr>
      <td>PHP ecosystem familiarity</td>
      <td>Laravel</td>
    </tr>
  </tbody>
</table>

<p><strong>Pilih berdasarkan kebutuhanmu, bukan hype atau popularitas.</strong></p>

<p>Semua tiga framework capable untuk membangun aplikasi web kelas dunia. GitHub (Rails), Instagram (Django), dan banyak enterprise apps (Laravel) proof bahwa ketiganya production-ready.</p>

<p>Jadi, daripada debat “mana terbaik,” lebih baik mulai bangun dan lihat sendiri mana yang paling nyaman untuk workflow kamu.</p>

<hr />

<blockquote>
  <p><em>Tidak ada winner absolut. Ada context yang tepat untuk masing-masing.</em></p>
</blockquote>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[saling adu framework adalah fenomena klasik yang sering muncul di kalangan developer. Jawaban jujur tidak ada yang secara objektif “lebih baik.” Yang ada adalah mana yang lebih cocok untuk situasi dan kebutuhan spesifik kamu.]]></summary></entry><entry><title type="html">Active Record Associations - Mengelola Hubungan Data dengan Elegan di Rails</title><link href="https://whdzera.com/blog/rails-active-record" rel="alternate" type="text/html" title="Active Record Associations - Mengelola Hubungan Data dengan Elegan di Rails" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>https://whdzera.com/blog/rails-active-record</id><content type="html" xml:base="https://whdzera.com/blog/rails-active-record"><![CDATA[<p>Dalam ekosistem Rails, Active Record Associations adalah salah satu fitur paling powerful yang membedakan Rails dari framework web lainnya. Namun, di balik kemudahan sintaks yang ditawarkan, tersimpan filosofi desain yang profundo tentang bagaimana seharusnya hubungan antar data dikelola dalam sebuah aplikasi.</p>

<hr />

<h2 id="menyusun-pikiran---apa-itu-associations">Menyusun Pikiran - Apa Itu Associations?</h2>

<p>Sebelum kita menyelami lebih jauh, penting untuk memahami bahwa Associations bukan sekadar cara untuk <strong>menghubungkan tabel</strong>. Associations adalah representasi abstrak dari hubungan logis antar entitas dalam domain aplikasi kita.</p>

<p>Bayangkan ketika kamu memiliki model <code class="language-plaintext highlighter-rouge">User</code> dan <code class="language-plaintext highlighter-rouge">Post</code>. Tanpa Associations, kamu harus menulis query SQL manual untuk mengambil semua post milik user tertentu. Dengan Associations, hubungan “seorang user memiliki banyak post” bukan sekadar query, melainkan sebuah konsep bisnis yang tertanam dalam kode.</p>

<hr />

<h2 id="jenis-jenis-associations-dan-maknanya">Jenis-Jenis Associations dan Maknanya</h2>

<h3 id="1-belongs_to">1. belongs_to</h3>

<p><code class="language-plaintext highlighter-rouge">belongs_to</code> menggambarkan hubungan where something belongs, di mana sebuah entitas secara logis “milik” entitas lain. Sebuah post belongs to a user. Sebuah komentar belongs to a post.</p>

<p>Dari perspektif filosofis, <code class="language-plaintext highlighter-rouge">belongs_to</code> adalah tentang tanggung jawab. Entitas yang memiliki <code class="language-plaintext highlighter-rouge">belongs_to</code> tidak bisa berdiri sendiri; keberadaannya bergantung pada entitas yang dimilikinya. Ini mencerminkan hubungan hierarkis dalam dunia nyata, sebuah order item tidak masuk akal tanpa order, sebuah comment tidak bermakna tanpa post.</p>

<hr />

<h3 id="2-has_many">2. has_many</h3>

<p><code class="language-plaintext highlighter-rouge">has_many</code> kebalikan dari <code class="language-plaintext highlighter-rouge">belongs_to</code>, di sini sebuah entitas “memiliki” banyak entitas lain. User has many posts.</p>

<p>Namun, filosofi di balik <code class="language-plaintext highlighter-rouge">has_many</code> lebih dalam dari sekadar “satu-ke-banyak.” <code class="language-plaintext highlighter-rouge">has_many</code> mengkomunikasikan bahwa entitas parent bukan sekadar container, melainkan sebuah konteks. Semua post yang dimiliki user berada dalam konteks user tersebut. mereka berbagi authorization, scoping, dan meaning.</p>

<hr />

<h3 id="3-has_one">3. has_one</h3>

<p><code class="language-plaintext highlighter-rouge">has_one</code> sering disalahpahami sebagai <code class="language-plaintext highlighter-rouge">has_many</code> yang dibatasi hanya satu. Pemahaman ini miss the point.</p>

<p><code class="language-plaintext highlighter-rouge">has_one</code> mengekspresikan hubungan di mana sebuah entitas secara eksklusif terhubung dengan satu entitas lain, dan entitas lain tersebut juga hanya memiliki satu hubungan serupa. Employee has one position dalam perusahaan (pada waktu tertentu). Profile has one user.</p>

<hr />

<h3 id="4-has_many-through">4. has_many :through</h3>

<p>Ini adalah where the magic happens. <code class="language-plaintext highlighter-rouge">has_many :through</code> memungkinkan kita membuat asosiasi tidak langsung. Tidak semua hubungan harus langsung. Kadang, makna ditransmisikan melalui entitas perantara. Seorang user terhubung dengan kategorinya bukan karena hubungan langsung, tetapi karena tulisan-tulisan yang ia tulis.</p>

<hr />

<h3 id="5-has_one-through">5. has_one :through</h3>

<p>Mirip dengan <code class="language-plaintext highlighter-rouge">has_many :through</code>, <code class="language-plaintext highlighter-rouge">has_one :through</code> memungkinkan hubungan eksklusif melalui entitas ketiga. Ini seperti membuat “jembatan eksklusif” antara dua entitas.</p>

<hr />

<h2 id="polymorphic-associations---fleksibilitas-tanpa-rigiditas">Polymorphic Associations - Fleksibilitas tanpa Rigiditas</h2>

<p>Polymorphic associations adalah fitur yang sering membuat developer baru bingung, tetapi sebenarnya menawarkan filosofi yang sangat powerful.</p>

<p>Bayangkan kamu ingin comment bisa milik baik Post maupun Photo. Tanpa polymorphic, kamu harus memilih: apakah membuat dua tabel komentar terpisah, atau menambahkan dua foreign key yang salah satunya selalu NULL.</p>

<p>Polymorphic associations menjawab pertanyaan: “Bagaimana jika sebuah entitas bisa memiliki hubungan tanpa mengetahui secara spesifik dengan apa ia berhubungan?”</p>

<p>Ini tentang decoupling, memisahkan “siapa yang memiliki” dari “apa yang dimiliki.”</p>

<hr />

<h2 id="counter-cache---efisiensi-yang-sering-terlupakan">Counter Cache - Efisiensi yang Sering Terlupakan</h2>

<p>Ketika kita bicara tentang <code class="language-plaintext highlighter-rouge">has_many</code>, pertanyaan natural adalah “Berapa banyak?”. Counter cache menjawab pertanyaan ini dengan menyimpan hitungan secara pre-computed. counter cache mengajarkan kita tentang trade-off antara consistency dan performance. Dalam sistem dengan trafik tinggi, menghitung setiap kali item akan sangat mahal. Counter cache mengorbankan konsistensi real-time demi performa yang lebih baik.</p>

<hr />

<h2 id="inverse-of---keteraturan-dalam-keterkaitan">Inverse Of - Keteraturan dalam Keterkaitan</h2>

<p>Inverse of adalah fitur yang sering diabaikan tetapi memiliki dampak filosofis yang besar. Ketika kamu mengambil sebuah post dan mengakses post.user, Rails biasanya cukup pintar untuk tahu bahwa user. posts harus merujuk ke post yang sama. Namun, dalam beberapa situasi terutama dengan nested attributes—inverse perlu didefinisikan secara eksplisit. Dalam sistem yang well-designed, mengubah objek di satu tempat harus konsisten di seluruh chain. Jika kamu mengubah judul post melalui object user, perubahan tersebut harus terlihat di object post.</p>

<hr />

<h3 id="pahami-bisnis-baru-teknologi">Pahami Bisnis, Baru Teknologi</h3>

<p>Sebelum memilih jenis associations, pahami dulu domain aplikasi. Apakah seorang author benar-benar “memiliki” bukunya, atau hanya “menulis”nya? Apakah sebuah subscription “memiliki” invoice, atau invoice “terkait dengan” subscription?</p>

<p>Pilihan kata dalam naming mencerminkan pemahaman bisnis. Associations yang poorly named sering kali mengindikasikan pemahaman domain yang masih dangkal.</p>

<hr />

<h3 id="hindari-over-associations">Hindari Over-Associations</h3>

<p>Sama seperti component yang terlalu tightly coupled, model dengan terlalu banyak associations adalah red flag. Setiap association menambah kompleksitas dan potensi N+1 query problems.</p>

<hr />

<h3 id="gunakan-scopes-untuk-klarifikasi">Gunakan Scopes untuk Klarifikasi</h3>

<p>Daripada membuat banyak associations untuk kondisi berbeda, pertimbangkan penggunaan scopes. <code class="language-plaintext highlighter-rouge">user.posts.published</code> lebih clear daripada <code class="language-plaintext highlighter-rouge">has_many :published_posts</code>.</p>

<hr />

<h2 id="penutup---associations-sebagai-bahasa-domain">Penutup - Associations sebagai Bahasa Domain</h2>

<p>Active Record Associations bukanlah feature teknis semata. Associations adalah bahasa di mana kita mengekspresikan domain aplikasi kita dalam kode.</p>

<p>Ketika kita menggunakan <code class="language-plaintext highlighter-rouge">has_many :comments</code> pada Post, kita sedang mendefinisikan bahwa Post adalah sesuatu yang bisa dikomentari. Ketika kita menggunakan <code class="language-plaintext highlighter-rouge">belongs_to :author</code>, kita mengekspresikan bahwa author adalah entitas yang bertanggung jawab atas konten.</p>

<p>Aplikasi yang menggunakan Associations dengan tepat adalah aplikasi yang bisa “dibaca” oleh orang non-teknis. Associations yang well-named adalah dokumentasi yang selalu up-to-date.</p>

<hr />

<blockquote>
  <p><em>Active Record Associations mengajarkan kita bahwa good software design bukan hanya tentang membuat kode yang bekerja, tetapi membuat kode yang mengkomunikasikan maksud.</em></p>
</blockquote>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Dalam ekosistem Rails, Active Record Associations adalah salah satu fitur paling powerful yang membedakan Rails dari framework web lainnya. Namun, di balik kemudahan sintaks yang ditawarkan, tersimpan filosofi desain yang profundo tentang bagaimana seharusnya hubungan antar data dikelola dalam sebuah aplikasi.]]></summary></entry><entry><title type="html">Tips Optimasi Performa Rails</title><link href="https://whdzera.com/blog/tips-optimasi-rails" rel="alternate" type="text/html" title="Tips Optimasi Performa Rails" /><published>2026-02-06T00:00:00+00:00</published><updated>2026-02-06T00:00:00+00:00</updated><id>https://whdzera.com/blog/tips-optimasi-rails</id><content type="html" xml:base="https://whdzera.com/blog/tips-optimasi-rails"><![CDATA[<p>Dalam perjalanan membangun aplikasi web dengan Rails, performa bukan sekadar soal kecepatan, melainkan tentang menghormati waktu pengguna, menjaga skalabilitas bisnis, dan menciptakan pengalaman yang mulus. Optimasi performa dalam Rails bukan sprint, melainkan maraton yang membutuhkan pemahaman mendalam tentang filosofi di balik setiap keputusan teknis.</p>

<hr />

<h2 id="1-pahami-the-rails-way-sebagai-fondasi-performa">1. Pahami “The Rails Way” sebagai Fondasi Performa</h2>

<p>Ruby on Rails dibangun di atas prinsip “Convention Over Configuration”. Ketika kita memahami dan mengikuti konvensi ini, Rails secara otomatis mengoptimasi banyak hal di balik layar. Banyak developer yang mengalami masalah performa justru karena mereka mencoba mempermudah Rails dengan menyimpang dari konvensinya.</p>

<p>Mengapa ini penting dari perspektif filosofis? Karena Rails telah dirancang oleh orang-orang yang jauh lebih berpengalaman untuk menyelesaikan masalah umum dengan cara yang sudah teruji. Melawan “The Rails Way” berarti mengorbankan optimasi bawaan yang telah dioptimalkan selama bertahun-tahun.</p>

<blockquote>
  <p>Belajar percaya terhadap framework. Pahami mengapa Rails menyarankan sesuatu sebelum memutuskan untuk melakukannya berbeda.</p>
</blockquote>

<hr />

<h2 id="2-database-adalah-jantung-aplikasi">2. Database adalah Jantung Aplikasi</h2>

<p>Dalam arsitektur Rails, database bukanlah sekadar tempat penyimpanan data. Database adalah partner strategis yang harus diperlakukan dengan hormat. Setiap query yang kita kirim ke database memiliki peran krusial yang mempengaruhi keseluruhan sistem.</p>

<p>Banyak developer pemula yang memandang database sebagai sesuatu yang dibelakang dan tidak perlu dipikirkan mendalam. Anggapan ini berbahaya. Satu query yang tidak efisien bisa menggagalkan seluruh optimasi di layer aplikasi.</p>

<hr />

<h2 id="3-caching-bukanlah-solution-melainkan-strategi">3. Caching Bukanlah Solution, Melainkan Strategi</h2>

<p>Ada pemahaman keliru bahwa caching adalah Kunci untuk semua masalah performa. Nyatanya, caching adalah pisau bermata dua—bisa mempercepat aplikasi secara dramatis, atau menciptakan bug yang sangat sulit dilacak jika digunakan dengan tidak tepat.</p>

<p>Caching yang baik lahir dari pemahaman kapan data benar-benar berubah dan kapan kita cukup puas dengan data. Ini adalah pertanyaan filosofis tentang toleransi ketidakakuratan melawan kebutuhan akan kecepatan.</p>

<blockquote>
  <p>Sebelum menambahkan caching, tanyakan masalah apa yang sebenarnya kamu selesaikan?</p>
</blockquote>

<hr />

<h2 id="4-lazy-loading-dan-eager-loading---seni-menunda-dan-menggiring">4. Lazy Loading dan Eager Loading - Seni Menunda dan Menggiring</h2>

<p>Konsep lazy loading dan eager loading dalam Rails mengajarkan kita tentang seni menunda pekerjaan yang tidak perlu dilakukan sekarang, dan menggiring pekerjaan yang akan dibutuhkan nanti.</p>

<p>Dari perspektif filosofis, ini tentang menjadi pintar dalam mengidentifikasi apa yang benar-benar dibutuhkan pengguna saat ini dengan apa yang mungkin dibutuhkan nanti. Membawa semua data upfront (eager loading tanpa diskriminasi) sama borosnya dengan menanyakan setiap data satu per satu (lazy loading tanpa foresight).</p>

<hr />

<h2 id="5-asynchronous-processing">5. Asynchronous Processing</h2>

<p>Ketika aplikasi Rails harus menyelesaikan tugas yang memakan waktu lama, pendekatan <strong>synchronous</strong> adalah pilihan yang berbahaya. Ini seperti memaksa seseorang untuk menyelesaikan percakapan telepon sambil menyelesaikan pekerjaan rumah, tidak akan bisa dilakukan dengan baik.</p>

<p>Message queues dan background jobs dalam Rails mengajarkan kita tentang komunikasi asynchronous, mengirim pesan, menyelesaikan tugas lain, dan kembali ketika pekerjaan selesai. Ini adalah filosofi tentang kepercayaan. kepercayaan bahwa sistem akan menyelesaikan pekerjaannya, dan kepercayaan bahwa kita bisa melakukan hal lain sambil menunggu.</p>

<blockquote>
  <p>Tidak semua hal harus selesai sekarang juga.</p>
</blockquote>

<hr />

<h2 id="6-profilisasi-sebelum-optimasi---diagnosis-sebelum-resep">6. Profilisasi Sebelum Optimasi - Diagnosis Sebelum Resep</h2>

<p>Salah satu kesalahan fatal dalam optimasi adalah langsung <strong>mengoptimasi</strong> tanpa melakukan profilisasi terlebih dahulu. Ini seperti pergi ke dokter dan langsung minta antibiotik tanpa pemeriksaan, bisa salah dan berbahaya.</p>

<p>Rails menyediakan tools seperti Bullet, rack-mini-profiler, dan New Relic yang membantu kita memahami di mana waktu benar-benar dihabiskan. Sebelum mengubah satu baris kode untuk alasan performa, kita harus punya data.</p>

<blockquote>
  <p>Jangan optimasi berdasarkan intuisi, optimasi berdasarkan evidence.</p>
</blockquote>

<hr />

<h2 id="7-skalabilitas-horizontal-vs-vertikal---fleksibilitas-dalam-arsitektur">7. Skalabilitas Horizontal vs Vertikal - Fleksibilitas dalam Arsitektur</h2>

<p>Dalam membuat Aplikasi web dengan Rails bukan hanya tentang membuat kode berjalan lebih cepat, tetapi juga tentang merancang arsitektur yang bisa <strong>scale</strong>. Ini tentang memilih antara menambah kapasitas pada mesin yang ada (vertical scaling) atau menambah lebih banyak mesin (horizontal scaling).</p>

<p>Dari sudut pandang filosofis, ini tentang membangun untuk masa depan. Aplikasi yang hanya bisa berjalan baik di satu server adalah aplikasi yang rapuh. Aplikasi yang bisa didistribusikan adalah aplikasi yang <strong>resilient</strong>.</p>

<blockquote>
  <p>Bayangkan Desain aplikasi seperti kamu sedang membangun kota. pikirkan transportasi, distribusi beban, dan redundansi.</p>
</blockquote>

<hr />

<h2 id="8-maintenance-mode">8. Maintenance Mode</h2>

<p>Aplikasi Rails harus tahu kapan harus <strong>menyerah dengan anggun</strong> Ketika sistem mengalami tekanan berlebih, opsi untuk masuk ke maintenance mode.</p>

<p>Ini filosofi yang penting, tidak semua fitur harus selalu tersedia dalam semua kondisi. Prioritaskan apa yang paling kritis, lepaskan apa yang kurang esensial. Ini tentang membuat keputusan sulit dengan kepala dingin.</p>

<blockquote>
  <p>Kekuatan sejati bukan tentang tidak pernah jatuh, tetapi tentang tahu bagaimana jatuh dengan bermartabat.</p>
</blockquote>

<hr />

<h2 id="penutup---performa-adalah-budaya-bukan-checklist">Penutup - Performa adalah Budaya, Bukan Checklist</h2>

<p>Memperbaiki performa aplikasi Rails bukan soal menerapkan checklist dan selesai. Performa adalah budaya yang harus tertanam dalam tim developer. Setiap keputusan coding, setiap query database, setiap pemilihan arsitektur semuanya harus dipertanyakan dari lensa performa.</p>

<p>Mulailah dengan memahami bahwa Rails telah menyediakan banyak alat dan konvensi untuk membantu kita. Kemudian, tambahkan lapisan pemahaman tentang kapan harus mengikuti Rails secara strict dan kapan harus berkreasi dengan bijak.</p>

<p>Optimasi performa yang sesungguhnya bukan tentang membuat aplikasi yang sangat cepat, tetapi tentang menciptakan pengalaman yang menghargai pengguna, menghormati sumber daya, dan siap untuk bertumbuh.</p>

<hr />

<p><strong>Catatan penutup</strong></p>

<blockquote>
  <p>Aplikasi yang bagus peforma nya adalah manifestasi dari developer yang <em>caring</em>. Caring tentang pengguna, caring tentang sistem, dan caring tentang craftsmanship.</p>
</blockquote>

<hr />

<p>Semoga artikel ini membantu kamu melihat optimasi Rails dari perspektif yang lebih dalam.</p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Dalam perjalanan membangun aplikasi web dengan Rails, performa bukan sekadar soal kecepatan, melainkan tentang menghormati waktu pengguna, menjaga skalabilitas bisnis, dan menciptakan pengalaman yang mulus. Optimasi performa dalam Rails bukan sprint, melainkan maraton yang membutuhkan pemahaman mendalam tentang filosofi di balik setiap keputusan teknis.]]></summary></entry><entry><title type="html">Redis di Rails</title><link href="https://whdzera.com/blog/redis-di-rails" rel="alternate" type="text/html" title="Redis di Rails" /><published>2026-01-03T00:00:00+00:00</published><updated>2026-01-03T00:00:00+00:00</updated><id>https://whdzera.com/blog/redis-di-rails</id><content type="html" xml:base="https://whdzera.com/blog/redis-di-rails"><![CDATA[<h2 id="apa-itu-redis">Apa itu Redis?</h2>

<p>Redis (<em>Remote Dictionary Server</em>) adalah salah satu <em>in-memory data store</em> yang sangat populer dan sering digunakan bersama Ruby on Rails untuk meningkatkan performa dan skalabilitas aplikasi. Pada artikel ini, kita akan membahas apa itu Redis, kenapa sering dipakai di Rails, serta contoh penggunaan umumnya.</p>

<p>Redis ini berbasis <em>key-value</em> yang berjalan di memori (RAM). Karena bekerja di memori, Redis sangat cepat dibandingkan database relasional seperti MySQL atau PostgreSQL.
Redis biasanya digunakan untuk Cache data, Session stor, Background job queue, Real-time data (counter, leaderboard, rate limiting)
Walaupun berbasis memori, Redis juga mendukung <em>persistence</em> ke disk, sehingga data bisa disimpan jika server direstart.</p>

<h2 id="kenapa-redis-populer-di-rails">Kenapa Redis Populer di Rails?</h2>

<p>Rails dikenal produktif, tapi performa bisa menjadi tantangan ketika aplikasi sudah besar. Redis hadir sebagai solusi untuk beberapa masalah umum di Rails.</p>

<p>Beberapa alasannya:</p>

<ol>
  <li>
    <p><strong>Performa Tinggi</strong>
Redis sangat cepat karena data disimpan di RAM. Cocok untuk mengurangi query berulang ke database.</p>
  </li>
  <li>
    <p><strong>Integrasi Mudah</strong>
Rails sudah menyediakan dukungan bawaan untuk cache menggunakan Redis.</p>
  </li>
  <li>
    <p><strong>Ekosistem Gem yang Kuat</strong>
Banyak gem Rails populer yang bergantung pada Redis, seperti Sidekiq dan Action Cable.</p>
  </li>
  <li>
    <p><strong>Skalabilitas</strong>
Redis membantu Rails menangani traffic tinggi dengan lebih efisien.</p>
  </li>
</ol>

<hr />

<h2 id="penggunaan-redis-di-rails">Penggunaan Redis di Rails</h2>

<h3 id="cache-di-rails">Cache di Rails</h3>

<p>Redis sering digunakan sebagai <em>cache store</em> untuk menyimpan hasil query atau proses berat.</p>

<p>Contoh penggunaan:</p>

<ul>
  <li>Cache hasil query ActiveRecord</li>
  <li>Cache halaman atau fragment</li>
</ul>

<p>Dengan cache, Rails tidak perlu menghitung ulang atau query ulang data yang sama.</p>

<h3 id="session-store">Session Store</h3>

<p>Secara default, Rails menyimpan session di cookie. Untuk aplikasi skala besar, session bisa disimpan di Redis agar:</p>

<ul>
  <li>Lebih aman</li>
  <li>Tidak membebani client</li>
  <li>Mudah dibagi antar server</li>
</ul>

<p>Ini sangat berguna untuk aplikasi yang menggunakan banyak server (load balancer).</p>

<h3 id="background-job-sidekiq">Background Job (Sidekiq)</h3>

<p>Sidekiq adalah background job processor populer di Rails dan <strong>wajib menggunakan Redis</strong>.</p>

<p>Contoh use case:</p>

<ul>
  <li>Kirim email</li>
  <li>Proses data besar</li>
  <li>Integrasi API pihak ketiga</li>
</ul>

<p>Dengan Redis, job bisa diproses secara asynchronous tanpa mengganggu request utama user.</p>

<h3 id="action-cable-websocket">Action Cable (WebSocket)</h3>

<p>Untuk fitur real-time seperti chat atau notifikasi, Rails menggunakan Action Cable.</p>

<p>Redis digunakan sebagai:</p>

<ul>
  <li>Pub/Sub adapter</li>
  <li>Media komunikasi antar server</li>
</ul>

<p>Tanpa Redis, fitur real-time akan sulit diskalakan.</p>

<hr />

<h2 id="kapan-sebaiknya-menggunakan-redis">Kapan Sebaiknya Menggunakan Redis?</h2>

<p>Gunakan Redis jika:</p>

<ul>
  <li>Aplikasi mulai lambat karena query berulang</li>
  <li>Membutuhkan background job</li>
  <li>Memiliki fitur real-time</li>
  <li>Traffic mulai tinggi</li>
</ul>

<p>Tidak wajib menggunakan Redis untuk aplikasi Rails kecil, tapi sangat disarankan ketika aplikasi mulai berkembang.</p>

<h2 id="kapan-tidak-perlu-redis">Kapan Tidak Perlu Redis?</h2>

<p>Redis mungkin belum diperlukan jika:</p>

<ul>
  <li>Aplikasi masih kecil</li>
  <li>Traffic masih rendah</li>
  <li>Belum ada kebutuhan async job atau real-time</li>
</ul>

<p>Menambahkan Redis terlalu dini bisa menambah kompleksitas.</p>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Redis adalah pasangan yang sangat kuat untuk Ruby on Rails. Dengan Redis, aplikasi Rails bisa menjadi Lebih cepat, scalable, dan siap untuk traffic besar
Jika kamu membangun aplikasi Rails serius untuk production, Redis hampir pasti akan menjadi bagian dari arsitektur aplikasimu.</p>

<hr />

<p>Semoga artikel ini membantu memahami Redis</p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Apa itu Redis?]]></summary></entry><entry><title type="html">Rails World 2025 di Amsterdam</title><link href="https://whdzera.com/blog/rails-world-2025" rel="alternate" type="text/html" title="Rails World 2025 di Amsterdam" /><published>2025-09-12T00:00:00+00:00</published><updated>2025-09-12T00:00:00+00:00</updated><id>https://whdzera.com/blog/rails-world-2025</id><content type="html" xml:base="https://whdzera.com/blog/rails-world-2025"><![CDATA[<p>Tahun 2025 kembali menjadi momen penting bagi komunitas Ruby on Rails dengan terselenggaranya <strong>Rails World 2025</strong> di Amsterdam, Belanda. Acara ini bukan sekadar konferensi teknologi, tapi juga perayaan atas keberlangsungan, evolusi, dan kreativitas dari ekosistem Rails. Dengan menghadirkan lebih dari 800 developer dari 62 negara, Rails World 2025 benar-benar menjadi melting pot ide, inovasi, dan pengalaman.</p>

<p>Kalian bisa nonton di <a href="https://www.youtube.com/playlist?list=PLHFP2OPUpCebhAv1ZWb_978cTl1o-yue-">Rails World 2025 YouTube playlist</a></p>

<hr />

<h2 id="pembukaan">Pembukaan</h2>

<p>Acara dibuka oleh <strong>David Heinemeier Hansson (DHH)</strong> yang kembali menekankan satu pesan klasik “<em>jangan terjebak dalam kompleksitas</em>”. Dalam era di mana banyak framework dan tool cenderung semakin rumit, DHH justru mengingatkan pentingnya menjaga kesederhanaan.</p>

<p>Selain itu, ia mengumumkan <strong>Rails 8.1 beta</strong> dengan berbagai fitur baru yang siap memperkuat produktivitas developer:</p>

<ul>
  <li><strong>Markdown Rendering</strong></li>
  <li><strong>Active Job Continuations</strong></li>
  <li><strong>Action Text Lexxy</strong></li>
  <li><strong>Beamer</strong></li>
  <li><strong>Active Record Tenating</strong></li>
  <li><strong>Kamal Geo Proxy</strong></li>
</ul>

<p>Menariknya, DHH juga mendemonstrasikan bagaimana ia bisa menyalakan laptop Framework, menginstal Omarchy OS, dan menjalankan aplikasi Rails hanya dalam waktu enam menit. Demo ini bukan hanya gimmick, tapi sebuah simbol bahwa Rails masih bisa tetap cepat, efisien, dan relevan di jaman sekarang.</p>

<h2 id="hotwire-native">Hotwire Native</h2>

<p><strong>Joe Masilotti</strong> menutup hari pertama dengan keynote tentang <strong>Hotwire Native</strong>.<br />
Topik ini menjadi salah satu highlight karena menjawab salah satu kebutuhan terbesar developer masa kini: membangun aplikasi <strong>web, iOS, dan Android</strong> tanpa menduplikasi business logic.</p>

<p>Dengan pendekatan ini, Rails semakin menegaskan posisinya sebagai <em>“framework full-stack yang sesungguhnya”</em>, mampu mengakomodasi pengembangan lintas platform dalam satu basis kode.</p>

<h2 id="ruby-di-masa-depan">Ruby di Masa Depan</h2>

<p>Hari kedua dibuka dengan sesi menarik bersama <strong>Aaron Patterson, Hiroshi Shibata, dan Jean Boussier</strong> dari tim maintainer Ruby, dipandu oleh <strong>Robby Russell</strong>.</p>

<p>Mereka berbagi tentang:</p>

<ul>
  <li>Perkembangan terbaru dalam bahasa Ruby.</li>
  <li>Tantangan teknis yang dihadapi tim inti.</li>
  <li>Harapan dan visi untuk ekosistem Ruby &amp; Rails ke depan.</li>
</ul>

<p>Sesi ini terasa spesial karena jarang sekali kita bisa mendengar langsung suara dari para maintainer Ruby yang bekerja di balik layar untuk menjaga bahasa ini tetap modern, powerful, dan ramah bagi developer.</p>

<h2 id="shopify-jit-dan-ractors">Shopify, JIT, dan Ractors</h2>

<p>Masih di hari kedua, <strong>Aaron Patterson</strong> kembali tampil dengan energi penuh.<br />
Ia memaparkan pekerjaan Shopify dalam mengeksplorasi <strong>Ractors</strong> untuk pemrosesan paralel, perkembangan <strong>ZJIT compiler</strong>, serta trik menulis kode yang lebih ramah JIT.</p>

<p>Presentasi ini penting karena menyentuh isu performa, salah satu kritik klasik terhadap Ruby. Shopify sebagai salah satu pengguna Rails terbesar di dunia menunjukkan bahwa ada investasi serius untuk menjadikan Ruby &amp; Rails semakin scalable.</p>

<h2 id="rails-at-scale-summit">Rails at Scale Summit</h2>

<p>Inovasi format di Rails World 2025 adalah hadirnya <strong>Rails at Scale Summit</strong> yang didukung Shopify.<br />
Summit ini fokus pada tantangan menjalankan aplikasi Rails dengan trafik tinggi dan kompleksitas besar.</p>

<ul>
  <li>Dihadiri oleh engineer dari <strong>36 perusahaan</strong>.</li>
  <li>Peserta dibatasi hanya <strong>100 orang</strong> agar diskusi lebih dalam dan personal.</li>
  <li>Format satu track dengan ruang untuk networking santai.</li>
</ul>

<p>Hasilnya? Feedback sangat positif. Banyak peserta merasa bisa berbagi dan belajar secara jujur tanpa tekanan. Summit ini memperlihatkan bahwa Rails bukan hanya framework untuk startup kecil, tapi juga mampu menopang sistem berskala besar.</p>

<h2 id="pengalaman-unik-dan-kreatif">Pengalaman Unik dan Kreatif</h2>

<p>Rails World 2025 juga menonjol dengan sentuhan kreatif di luar sesi teknis.<br />
Beberapa di antaranya:</p>

<ul>
  <li><strong>Ruby Embassy &amp; Ruby Passport</strong>: pengalaman ala birokrasi lucu lengkap dengan stempel paspor dan bahkan lightsaber.</li>
  <li><strong>Ruby Phone</strong>: instalasi interaktif di mana peserta bisa mengirim pesan video, meninggalkan catatan, atau ngobrol spontan lewat telepon yang terhubung.</li>
  <li><strong>Baltic Ruby Bingo Boat</strong>: transportasi unik menuju venue, menambah warna khas Amsterdam.</li>
  <li><strong>Lightning Track</strong>: 16 pembicara membawakan presentasi singkat nan padat, dipandu oleh Huntress.</li>
  <li><strong>Closing Party di Straat Museum</strong>: ditutup dengan pesta meriah berisi musik, seni, makanan, dan tarian.</li>
</ul>

<p>Bagian ini membuktikan bahwa Rails World bukan hanya konferensi tech yang kaku, melainkan juga ruang sosial untuk merayakan budaya developer.</p>

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Rails World 2025 di Amsterdam berhasil membuktikan tiga hal penting:</p>

<ol>
  <li>
    <p><strong>Rails masih relevan dan berkembang.</strong><br />
Dengan hadirnya Rails 8.1 dan inovasi seperti Hotwire Native, Rails terus beradaptasi dengan kebutuhan zaman.</p>
  </li>
  <li>
    <p><strong>Komunitas adalah kekuatan utama.</strong><br />
Lebih dari 800 developer berkumpul, saling berbagi ilmu, pengalaman, bahkan humor. Energi positif ini adalah bahan bakar bagi ekosistem Rails.</p>
  </li>
  <li>
    <p><strong>Rails siap untuk skala besar.</strong><br />
Rails at Scale Summit menegaskan bahwa Rails bisa menjadi tulang punggung aplikasi dengan jutaan pengguna dan trafik tinggi.</p>
  </li>
</ol>

<p>Secara keseluruhan, Rails World 2025 bukan hanya sekadar update teknis, tapi juga bukti bahwa Rails adalah komunitas global yang hidup, kreatif, dan penuh inovasi.</p>

<hr />

<h2 id="menuju-rails-world-2026">Menuju Rails World 2026</h2>

<p>Tahun depan, Rails World akan digelar di <strong>Austin, Texas</strong> pada akhir September 2026.<br />
semoga author bisa ke sana ya</p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Tahun 2025 kembali menjadi momen penting bagi komunitas Ruby on Rails dengan terselenggaranya Rails World 2025 di Amsterdam, Belanda. Acara ini bukan sekadar konferensi teknologi, tapi juga perayaan atas keberlangsungan, evolusi, dan kreativitas dari ekosistem Rails. Dengan menghadirkan lebih dari 800 developer dari 62 negara, Rails World 2025 benar-benar menjadi melting pot ide, inovasi, dan pengalaman.]]></summary></entry><entry><title type="html">Halaman Error Lebih Baik dengan Gem better_errors di Rails</title><link href="https://whdzera.com/blog/tutorial-gem-better-errors-di-rails" rel="alternate" type="text/html" title="Halaman Error Lebih Baik dengan Gem better_errors di Rails" /><published>2025-04-21T00:00:00+00:00</published><updated>2025-04-21T00:00:00+00:00</updated><id>https://whdzera.com/blog/tutorial-gem-better-errors-di-rails</id><content type="html" xml:base="https://whdzera.com/blog/tutorial-gem-better-errors-di-rails"><![CDATA[<p>Saat mengembangkan aplikasi Ruby on Rails, tampilan error default seringkali terasa kurang informatif. Untuk pengalaman debugging yang lebih baik, kita bisa menggunakan <strong>gem <a href="https://github.com/BetterErrors/better_errors">better_errors</a></strong>.</p>

<p>Dengan gem ini, halaman error akan jauh lebih interaktif, lengkap dengan stack trace, preview variabel, hingga akses konsol Rails langsung dari browser.</p>

<hr />

<h2 id="1-tambahkan-gem-ke-gemfile">1. Tambahkan Gem ke Gemfile</h2>

<p>Buka file <code class="language-plaintext highlighter-rouge">Gemfile</code> lalu tambahkan:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">group</span> <span class="ss">:development</span> <span class="k">do</span>
  <span class="n">gem</span> <span class="s1">'better_errors'</span>
  <span class="n">gem</span> <span class="s1">'binding_of_caller'</span>
<span class="k">end</span>
</code></pre></div></div>

<blockquote>
  <p><code class="language-plaintext highlighter-rouge">binding_of_caller</code> opsional tapi sangat disarankan, karena memungkinkan kita membuka IRB console langsung di halaman error.</p>
</blockquote>

<h2 id="2-install-dependensi">2. Install Dependensi</h2>

<p>Jalankan perintah:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">install</span>
</code></pre></div></div>

<h2 id="3-konfigurasi-opsional">3. Konfigurasi (Opsional)</h2>

<p>Secara default, <strong>better_errors</strong> hanya aktif di <strong>environment development</strong>.<br />
Kalau kamu ingin mengakses error page ini dari mesin lain (misalnya di jaringan lokal), tambahkan konfigurasi di <code class="language-plaintext highlighter-rouge">config/environments/development.rb</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">BetterErrors</span><span class="o">::</span><span class="no">Middleware</span><span class="p">.</span><span class="nf">allow_ip!</span> <span class="s2">"0.0.0.0/0"</span>
</code></pre></div></div>

<blockquote>
  <p>Hati-hati! Jangan mengaktifkan ini di <strong>production</strong>, karena bisa membocorkan informasi sensitif.</p>
</blockquote>

<h2 id="4-coba-trigger-error">4. Coba Trigger Error</h2>

<p>Untuk menguji, buat error sederhana di salah satu controller:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">index</span>
  <span class="k">raise</span> <span class="s2">"Test Better Errors"</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Akses halaman tersebut, maka kamu akan melihat tampilan error yang jauh lebih informatif dibandingkan default Rails.</p>

<h2 id="5-fitur-utama">5. Fitur Utama</h2>

<ul>
  <li>Tampilan error dengan syntax highlight.</li>
  <li>Stack trace yang bisa diklik dan ditelusuri.</li>
  <li>Preview nilai variabel di setiap level stack.</li>
  <li>IRB console langsung di browser (butuh <code class="language-plaintext highlighter-rouge">binding_of_caller</code>).</li>
</ul>

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Menggunakan <strong>better_errors</strong> membuat debugging di Rails jauh lebih cepat dan menyenangkan.<br />
Dengan informasi error yang lebih jelas, kita bisa lebih mudah menemukan dan memperbaiki bug.</p>

<p>Kalau kamu sering bekerja dengan Rails, gem ini adalah salah satu yang <strong>wajib</strong> dipasang di environment development.</p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Saat mengembangkan aplikasi Ruby on Rails, tampilan error default seringkali terasa kurang informatif. Untuk pengalaman debugging yang lebih baik, kita bisa menggunakan gem better_errors.]]></summary></entry><entry><title type="html">Pagination pakai Gem Kaminari di Rails</title><link href="https://whdzera.com/blog/pagination-pakai-gem-kaminari-di-rails" rel="alternate" type="text/html" title="Pagination pakai Gem Kaminari di Rails" /><published>2025-03-06T00:00:00+00:00</published><updated>2025-03-06T00:00:00+00:00</updated><id>https://whdzera.com/blog/pagination-pakai-gem-kaminari-di-rails</id><content type="html" xml:base="https://whdzera.com/blog/pagination-pakai-gem-kaminari-di-rails"><![CDATA[<h3 id="apa-itu-kaminari">Apa Itu Kaminari?</h3>

<p>Kaminari adalah sebuah gem Ruby untuk melakukan pagination pada ActiveRecord, Mongoid, dan berbagai ORM lainnya.
Pagination adalah fitur penting dalam aplikasi web untuk menampilkan data dalam jumlah besar secara efisien, kamu bisa dengan mudah membatasi jumlah item yang ditampilkan di satu halaman, serta menyediakan navigasi untuk pindah ke halaman-halaman berikutnya.</p>

<p>Berikut ini cara memakai Gem Kaminari di Ruby on rails.</p>

<h4 id="1-instalasi">1. Instalasi</h4>

<p>Tambahkan Kaminari ke file <code class="language-plaintext highlighter-rouge">Gemfile</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">gem</span> <span class="s1">'kaminari'</span>
</code></pre></div></div>

<p>Kemudian jalankan perintah:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bundle</span> <span class="n">install</span>
</code></pre></div></div>

<h4 id="2-setup-pagination-di-controller">2. Setup Pagination di Controller</h4>

<p>Misalkan kamu punya model Post, dan ingin menampilkan daftar postingan yang dipaginasi.</p>

<p>Di <code class="language-plaintext highlighter-rouge">posts_controller.rb</code>, ubah action index seperti berikut:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">index</span>
  <span class="vi">@posts</span> <span class="o">=</span> <span class="no">Post</span><span class="p">.</span><span class="nf">order</span><span class="p">(</span><span class="ss">created_at: :desc</span><span class="p">).</span><span class="nf">page</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:page</span><span class="p">]).</span><span class="nf">per</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">page(params[:page])</code> Menentukan halaman saat ini berdasarkan parameter URL <code class="language-plaintext highlighter-rouge">?page=</code></p>

<h4 id="3-tampilkan-pagination-di-view">3. Tampilkan Pagination di View</h4>

<p>Di file <code class="language-plaintext highlighter-rouge">app/views/posts/index.html.erb</code>, tambahkan kode berikut setelah daftar item:</p>

<div class="language-erb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;%</span> <span class="vi">@posts</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">post</span><span class="o">|</span> <span class="cp">%&gt;</span>
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"post"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;h2&gt;</span><span class="cp">&lt;%=</span> <span class="n">post</span><span class="p">.</span><span class="nf">title</span> <span class="cp">%&gt;</span><span class="nt">&lt;/h2&gt;</span>
    <span class="nt">&lt;p&gt;</span><span class="cp">&lt;%=</span> <span class="n">truncate</span><span class="p">(</span><span class="n">post</span><span class="p">.</span><span class="nf">content</span><span class="p">,</span> <span class="ss">length: </span><span class="mi">100</span><span class="p">)</span> <span class="cp">%&gt;</span><span class="nt">&lt;/p&gt;</span>
  <span class="nt">&lt;/div&gt;</span>
<span class="cp">&lt;%</span> <span class="k">end</span> <span class="cp">%&gt;</span>

<span class="cp">&lt;%=</span> <span class="n">paginate</span> <span class="vi">@posts</span> <span class="cp">%&gt;</span>
</code></pre></div></div>

<h4 id="4-kustomisasi-tampilan-paginasi">4. Kustomisasi Tampilan Paginasi</h4>

<p>Kaminari menyediakan generator untuk membuat file partial yang bisa kamu modifikasi:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rails g kaminari:views default
</code></pre></div></div>

<p>Ini akan menghasilkan file-file ERB di <code class="language-plaintext highlighter-rouge">app/views/kaminari/</code>. Kamu bisa mengedit tampilan tombol pagination sesuai selera, atau menambahkan class Tailwind, Bulma, Bootstrap, dsb.</p>

<p>Contoh kustomisasi tombol:</p>

<div class="language-erb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;li</span> <span class="na">class=</span><span class="s">"page-item </span><span class="cp">&lt;%=</span> <span class="s1">'active'</span> <span class="k">if</span> <span class="n">current_page?</span> <span class="cp">%&gt;</span><span class="s">"</span><span class="nt">&gt;</span>
  <span class="cp">&lt;%=</span> <span class="n">link_to</span> <span class="n">page</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="ss">class: </span><span class="s2">"page-link"</span> <span class="cp">%&gt;</span>
<span class="nt">&lt;/li&gt;</span>
</code></pre></div></div>

<h4 id="5-contoh-url-paginasi">5. Contoh URL Paginasi</h4>

<p>Setelah setup di atas, kamu bisa membuka URL seperti:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://localhost:3000/posts?page=2
</code></pre></div></div>

<p>Dan Rails akan menampilkan halaman ke-2 dari daftar Post</p>

<p>Dengan gem Kaminari, proses pagination di aplikasi Rails menjadi sangat mudah dan fleksibel. Kamu bisa menggunakannya di berbagai model, mengkustom tampilan, serta menggabungkannya dengan AJAX atau infinite scrolling untuk pengalaman pengguna yang lebih modern.</p>

<p>Semoga tutorial ini bermanfaat! Jika ada pertanyaan atau saran, silakan tinggalkan komentar di bawah.</p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Apa Itu Kaminari?]]></summary></entry><entry><title type="html">Cara Pasang Tema di jekyll</title><link href="https://whdzera.com/blog/cara-pasang-tema-di-jekyll" rel="alternate" type="text/html" title="Cara Pasang Tema di jekyll" /><published>2025-02-12T00:00:00+00:00</published><updated>2025-02-12T00:00:00+00:00</updated><id>https://whdzera.com/blog/cara-pasang-tema-di-jekyll</id><content type="html" xml:base="https://whdzera.com/blog/cara-pasang-tema-di-jekyll"><![CDATA[<p>Halo!<br />
Kalau kamu sedang membangun blog statis pakai Jekyll dan pengen tampil beda, kamu bisa mulai dengan mengganti <strong>tema Jekyll-nya</strong>. Di artikel ini, gw akan tunjukin langkah-langkah simpel buat pasang tema di Jekyll, sekaligus promosi dikit tema buatanku sendiri (:v hehe) : <strong><a href="https://github.com/whdzera/jekyll-niri">Niri Theme Jekyll</a></strong>.</p>

<hr />

<h4 id="1-instalasi-jekyll-lewati-jika-sudah">1. Instalasi Jekyll (Lewati Jika Sudah)</h4>

<p>Kalau kamu belum install Jekyll, jalankan perintah ini:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem <span class="nb">install </span>jekyll
</code></pre></div></div>

<p>Lalu buat proyek Jekyll baru (atau lewati jika kamu sudah punya):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jekyll new nama_app
</code></pre></div></div>

<h4 id="2-tambahkan-tema-ke-proyek-jekyll">2. Tambahkan Tema ke Proyek Jekyll</h4>

<p>Untuk menggunakan tema Niri, edit file <code class="language-plaintext highlighter-rouge">Gemfile</code> kamu dan tambahkan:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem <span class="s2">"niri"</span>, <span class="s2">"~&gt; 1.4"</span>
</code></pre></div></div>

<p>Setelah itu jalankan:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle
</code></pre></div></div>

<p>Selanjutnya, buka file <code class="language-plaintext highlighter-rouge">_config.yml</code> dan tambahkan:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>theme: niri
</code></pre></div></div>

<h4 id="3-jalankan-proyekmu">3. Jalankan Proyekmu</h4>

<p>Saatnya lihat hasilnya! Jalankan Jekyll server:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll s
</code></pre></div></div>

<p>Buka browser dan arahkan ke:</p>

<p><code class="language-plaintext highlighter-rouge">http://localhost:4000</code></p>

<p>Voila! Tema baru kamu sudah tampil.</p>

<h4 id="4-untuk-github-pages">4. Untuk Github Pages</h4>

<p>Jika kamu ingin deploy ke GitHub Pages, kamu perlu menggunakan <code class="language-plaintext highlighter-rouge">remote_theme</code> karena GitHub Pages tidak mengizinkan semua gem pihak ketiga. Tambahkan ini di <code class="language-plaintext highlighter-rouge">_config.yml</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>remote_theme: whdzera/jekyll-niri
</code></pre></div></div>

<h4 id="5-cari-tema-jekyll-lainnya">5. Cari Tema Jekyll Lainnya</h4>

<p>Kalau kamu ingin eksplorasi tema-tema lain, cek beberapa situs berikut:</p>

<ul>
  <li><a href="http://jekyllthemes.org/">jekyllthemes.org</a></li>
  <li><a href="https://jekyllthemes.io/">jekylltheme.io</a></li>
  <li><a href="https://jamstackthemes.dev/ssg/jekyll/">jamstackthemes</a></li>
  <li>Github kata kunci search ‘jekyll theme’</li>
</ul>

<table>
  <tbody>
    <tr>
      <td>Tips: Selalu cek dokumentasi masing-masing tema untuk cara instalasi yang tepat ya!</td>
    </tr>
  </tbody>
</table>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Halo! Kalau kamu sedang membangun blog statis pakai Jekyll dan pengen tampil beda, kamu bisa mulai dengan mengganti tema Jekyll-nya. Di artikel ini, gw akan tunjukin langkah-langkah simpel buat pasang tema di Jekyll, sekaligus promosi dikit tema buatanku sendiri (:v hehe) : Niri Theme Jekyll.]]></summary></entry><entry><title type="html">Install Ruby dan Rails di Linux Ubuntu</title><link href="https://whdzera.com/blog/install-ruby-on-rails-di-linux" rel="alternate" type="text/html" title="Install Ruby dan Rails di Linux Ubuntu" /><published>2019-04-18T00:00:00+00:00</published><updated>2019-04-18T00:00:00+00:00</updated><id>https://whdzera.com/blog/install-ruby-on-rails-di-linux</id><content type="html" xml:base="https://whdzera.com/blog/install-ruby-on-rails-di-linux"><![CDATA[<h3 id="alasan">Alasan</h3>

<p>mengapa ruby on rails ? karena framework ruby on rails , MVC dan bahasa ruby sangat elegan dan enak dipandang, mungkin :) . tenang, gampang kok instal ruby dan ruby on rails di Ubuntu</p>

<p>jadi gak usah banyak kata, langsung aja kita mulai :</p>

<h3 id="persiapan">Persiapan</h3>

<p>-Koneksi Internet Stabil</p>

<p>-Akses Root</p>

<p>-Sudah terinstal Curl</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>apt-get <span class="nb">install </span>curl
</code></pre></div></div>

<h3 id="instal-ruby-dengan-rvm">Instal Ruby dengan RVM</h3>

<p>rvm adalah ruby version manager . fungsinya untuk memanage versi dari ruby dan rails.
keuntunganya kita bisa berganti versi dari ruby dan rails dengan mudah dan gak ribet</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="se">\c</span>url <span class="nt">-L</span> https://get.rvm.io | bash <span class="nt">-s</span> stable <span class="nt">--ruby</span>
</code></pre></div></div>

<p>update rvm dan instal ruby, disini saya menggunakan ruby versi 2.4.0</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rvm get stable <span class="nt">--autolibs</span><span class="o">=</span><span class="nb">enable</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rvm <span class="nb">install </span>ruby
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rvm <span class="nt">--default</span> use ruby-2.4.0
</code></pre></div></div>

<p>cek ruby sudah terinstal</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>ruby <span class="nt">-v</span>
</code></pre></div></div>

<p>cek gem</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gem <span class="nt">-v</span>
</code></pre></div></div>

<p>update gem</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gem update <span class="nt">--system</span>
</code></pre></div></div>

<p>set rvm global gemset dan gem yg ada</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rvm gemset use global
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gem list
</code></pre></div></div>

<p>instal rails dengan ruby gems</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>gem <span class="nb">install </span>rails
</code></pre></div></div>

<p>cek rails sudah teinstal</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rails <span class="nt">-v</span>
</code></pre></div></div>

<p>selesai . kita sudah menginstal ruby dan ruby on rails :)
kita sudah bisa buat project atau aplikasi dengan ruby on rails</p>

<h3 id="buat-project-baru">Buat project baru</h3>

<p>buat direktori baru</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">mkdir </span>project_rubyonrails
</code></pre></div></div>

<p>masuk direktori project_rubyonrails</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cd </span>project_rubyonrails
</code></pre></div></div>

<p>buat project baru ruby on rails</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rails new appku
</code></pre></div></div>

<p>masuk direktori project appku</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cd </span>appku
</code></pre></div></div>

<p>test server</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>rails s
</code></pre></div></div>

<p>buka browser dan ketik di address bar</p>

<p><code class="language-plaintext highlighter-rouge">http://localhost:3000</code></p>

<p>jika tidak ada masalah . akan seperti gambar dibawah</p>

<p><img src="https://s3.gifyu.com/images/eNjSzlZ8UOw.jpg" alt="sucess" /></p>]]></content><author><name>whdzera</name></author><summary type="html"><![CDATA[Alasan]]></summary></entry></feed>