Custom Validation in Ecto
Sometimes the standard validation options aren't enough.
You can create a custom validator in Ecto using the validate_change
function.
In this particular case, I want to validate that thing
has an odd number of limbs. I can pass the changeset to validate_odd_number
.
def changeset(thing, attrs) do
thing
|> cast(attrs, [
:number_of_limbs
])
|> validate_odd_number(
:number_of_limbs
)
end
And then define validate_odd_number
like this:
def validate_odd_number(changeset, field) when is_atom(field) do
validate_change(changeset, field, fn (current_field, value) ->
if rem(value, 2) == 0 do
[{f, "This field must be an odd number"}]
else
[]
end
end)
end
We pass a function to validate_change that takes the field atom and the value for that field. In that function we test for oddness and return a keyword list that contains the field name and an error message.
Remember that when f
is :number_of_limbs
:
[{f, "hi"}] == [number_of_limbs: "hi"]
# true, these data structures are equal
Tweet