LoginSignup
2
0

More than 5 years have passed since last update.

Ectoでカスタムバリデーションを追加する

Posted at

概要

カスタムバリデーションの追加時は、下記を満たす関数を定義して、changesetのバリデーションに使用する。

  • 引数としてchangesetそのものを取る
  • バリデーション条件に合致するデータはそのまま返す
  • バリデーション条件にハッチしないデータに対してはエラーを追加して返す。

例えば、英数のみを許容すると言ったバリデーションは下記のように定義する。

custom_validation
     def validate_alphanumeric(changeset,field_name) do
       field_value = get_field(changeset, field_name)
       validate_alphanumeric_p(changeset, field_value)
     end

     defp validate_alphanumeric_p(changeset, nil) do
         add_error(changeset, :alphanumeric, "invalid data")
     end
     defp validate_alphanumeric_p(changeset,field_value) do
       if Regex.match?(~r/^[0-9A-z]+$/, field_value) do
         changeset
       else
         add_error(changeset, :alphanumeric, "must be number or alphabet")
       end
     end

定義したバリデーションを、changesetに対して使用する

changeset
def changeset(user, params \\ %{}) do
    user
    |> cast(params, [:user_id])
    |> validate_alphanumeric(:user_id)
end

余談

「フィールドに対して英数のみを許容する」バリデーションであればvalidate_formatを使用して下記のように書けば良い

validate_alnum
def changeset(user, params \\ %{}) do
    user
    |> cast(params, [:user_id])
    |> validate_format(:user_id, ~r/^[[:alnum:]]+$/)
end
2
0
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
2
0