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

Act on specific errors in a changeset returned by Repo.update

我想根据具体的错误设置一个赋值 Ecto.update,最好的方法是什么?在我的例子中,返回的变更集是:

#Ecto.Changeset<action: :update,
 changes: %{password: "blabla",
   password_bcrypt: "b$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 语句中的空列表进行比较,但我做对了。另外:我使用的方法正确吗?

在评论部分进行澄清后,您似乎想为变更集 errors 中存在的每个字段创建一个 #{field}_error 分配。这可以通过 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)