对Repo.update返回的变更集中的特定错误采取行动

时间:2017-03-15 10:01:54

标签: elixir ecto

我想设置一个分配,具体取决于Ecto.update禁止的特定错误,最好的方法是什么?在我的情况下,返回的变更集是:

#Ecto.Changeset<action: :update,
 changes: %{password: "blabla",
   password_bcrypt: "$2b$12$s48wU....."},
 errors: [password_confirmation: {"password incorrect",
   [validation: :confirmation]},
  password: {"should be at least %{count} character(s)",
   [count: 8, validation: :length, min: 8]}], data: #Backend.AuthPersona<>,
 valid?: false>

但它也可以是:

#Ecto.Changeset<action: :update, changes: %{email: nil},
 errors: [email: {"can't be blank", [validation: :required]}],
 data: #Backend.AuthPersona<>, valid?: false>

我需要根据返回的错误设置一个赋值,这样我就可以激活表单中的正确选项卡。

我尝试过这样的理解:

for { :email, error } <- errors, do: error 

我想我可以将返回值与case语句中的空列表进行比较,但我无法正确理解。另外:我使用正确的方法吗?

1 个答案:

答案 0 :(得分:0)

在评论部分澄清之后,您似乎想要为变更集#{field}_error中的每个字段创建errors分配。这可以通过Enum.reduce

来实现
conn = Enum.reduce(changeset.errors, conn, fn {field, _}, conn ->
  assign(conn, :"#{field}_error", true)
end)

如果您的变更集包含3个字段foobarbaz,则上述内容与此相同:

conn = assign(conn, :foo_error, true)
conn = assign(conn, :bar_error, true)
conn = assign(conn, :baz_error, true)