3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ectoで「エラーメッセージカスタマイズ」と「独自バリデーション関数作成」

Posted at

今回の目標

  • エラーメッセージカスタマイズ
    • validate_requiredエラーメッセージを変更
      • 「can't be blank」→ 「空でござる」
  • 独自バリデーション関数作成
    • 最小文字数が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 にアクセス

エラーメッセージカスタマイズ検証
image.png

image.png

独自バリデーション関数検証
image.png

User.changesetが通過するとエラーが消える
image.png

ソース(github)

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?