今回の目標
- エラーメッセージカスタマイズ
- validate_requiredエラーメッセージを変更
- 「can't be blank」→ 「空でござる」
- validate_requiredエラーメッセージを変更
- 独自バリデーション関数作成
- 最小文字数が2文字
- a〜zを含む
プロジェクト作成
$ mix phx.new ecto_experiment --database sqlite3
$ cd ecto_experiment
$ mix ecto.create
phx.gen.liveでecto実験用ソース作成
$ mix phx.gen.live Accounts User users name:string
$ mix ecto.migrate
ルーター設定
lib/ecto_experiment_web/router.ex
defmodule EctoExperimentWeb.Router do
# 〜省略〜
scope "/", EctoExperimentWeb do
pipe_through :browser
+ live "/users", UserLive.Index, :index
+ live "/users/new", UserLive.Index, :new
+ live "/users/:id/edit", UserLive.Index, :edit
+ live "/users/:id", UserLive.Show, :show
+ live "/users/:id/show/edit", UserLive.Show, :edit
get "/", PageController, :home
end
# 〜省略〜
end
「エラーメッセージカスタマイズ」と「独自バリデーション関数作成」
lib/ecto_experiment/accounts/user.ex
defmodule EctoExperiment.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
field :name, :string
timestamps()
end
@doc false
def changeset(user, attrs) do
IO.inspect(attrs)
user
|> cast(attrs, [:name])
- |> validate_required([:name])
+ |> validate_required([:name], message: "空でござる") # エラーメッセージカスタマイズ
+ |> validate_name()
end
# 独自独自バリデーション関数作成
+ defp validate_name(changeset) do
+ changeset
+ |> validate_length(:name, min: 2, message: "最小は2文字でござる")
+ |> validate_format(:name, ~r/[a-z]/, message: "a〜zを含むでござる")
+ end
end
実行
$ mix phx.server
http://localhost:4000/users/new
にアクセス
ソース(github)