Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Elixir pattern match on ecto error

Tags:

I am relying on Ecto to return an error when an insert fails a database level constraint.

Is it possible to run different code depending on the error type returned by Ecto?

case Repo.insert(changeset) do
        {:ok, _} ->
            IO.puts("inserted")
        {:error, message} when is_certain_ecto_error ->
            IO.puts("database constraint error")
        {:error, message}  ->
            IO.puts("everything else error")
end
like image 961
henry.oswald Avatar asked Jul 14 '17 16:07

henry.oswald


1 Answers

Like Justin said, you will get {:error, changeset}, the changeset would have the errors keyword list, where you can pattern match on.

case Repo.insert(changeset) do
    {:ok, _} -> 
        IO.puts("inserted")
    {:error, %{ errors: errors }} ->                  
        Enum.map(errors, &handle_error(&1))
end

defp handle_error({:user_name, {message, _}}) do
   "User name error:" <> message
end
defp handle_error({_some_key, _error_tuple}), do: "some error"
like image 54
webdeb Avatar answered Sep 29 '22 23:09

webdeb