概要
カスタムバリデーションの追加時は、下記を満たす関数を定義して、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