Study
Phoenix

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.

Editor Latihan

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.