LoginSignup
10
8

More than 5 years have passed since last update.

Ecto 2.0 に対応した changeset/2 の書き方

Posted at

Changelog for v2.0
Revamped changesetsに記載がありますが、Ecto 2.0 では changeset/2 の第二引数のデフォルトが :empty から %{} に変更になりました。またそれに伴い、cast/4 も廃止予定となり、cast/3 と validate_required/3 を組み合わせて書くことが推奨されています。

従来の書き方
def changeset(user, params \\ :empty) do
  user
  |> cast(params, [:name], [:age])
end
Ecto2.0対応版
@params = ~w[name age]a
def changeset(user, params \\ %{}) do
  user
  |> cast(params, @paramas)
  |> validate_required(~w[name]a)
end

またこれに伴い、初期表示の時のアクションなど :empty が入ることを期待していた
処理を少し変えてやる必要があります(そうしないと、「メールアドレスが未入力です」のようなバリデーションエラーがいきなり表示されてしまうことになります)。

モデルの changeset/2 のバリデーションを通さない方法は色々あるかと思いますが、個人的には Ecto.Changeset.change/2 を利用して、changeset.valid? が true な changeset を生成してしまうのが好みです。こうすることにより、モデルの changeset/2 はデータをPOSTされた後にしか呼び出されないため、バリデーションの処理に集中することができます。

初期表示の時のアクションの例
defmodule UserController do
  def new(conn, _params) do
    changeset = Ecto.Changeset.change(%User{})
    render(conn, "new.html", changeset: changeset)
  end
end
10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8