Ecto Changeset & Validasi
Penjelasan
Changeset adalah struct Ecto yang membungkus proses transformasi data mentah menjadi data valid sebelum disimpan. Alih-alih memvalidasi langsung di controller, kita membuat fungsi changeset di dalam schema yang menerima struct dan attrs (map data mentah), lalu memakai fungsi seperti cast/3 untuk memilih field mana yang boleh diisi, dan validate_required/2, validate_length/3, validate_number/3 untuk aturan validasi. Setelah changeset dibuat, kita bisa memeriksa changeset.valid? atau langsung memasukkannya ke Repo.insert/update yang akan mengembalikan {:ok, struct} jika valid atau {:error, changeset} berisi daftar error jika tidak valid. Pola ini memisahkan aturan bisnis dari lapisan web sehingga mudah dites.
Contoh Konsep
defmodule TokoApp.Catalog.Produk do
use Ecto.Schema
import Ecto.Changeset
schema "produk" do
field :nama, :string
field :harga, :integer
timestamps()
end
def changeset(produk, attrs) do
produk
|> cast(attrs, [:nama, :harga])
|> validate_required([:nama, :harga])
|> validate_number(:harga, greater_than: 0)
end
end
# Pemakaian
changeset = TokoApp.Catalog.Produk.changeset(%TokoApp.Catalog.Produk{}, %{nama: "Topi", harga: -5})
changeset.valid? # false, karena harga tidak boleh negatif
Praktikum
Lengkapi fungsi changeset schema Artikel agar judul wajib diisi dan panjangnya minimal 5 karakter.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Selalu whitelist field dengan cast/3, jangan pernah cast semua field secara otomatis, supaya user tidak bisa mengisi field sensitif seperti role atau saldo lewat form biasa.