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