Elixir 对Repo.update返回的变更集中的特定错误执行操作

Elixir 对Repo.update返回的变更集中的特定错误执行操作,elixir,ecto,Elixir,Ecto,我想根据具体的错误设置一个赋值,比如说,什么是最好的方法?在我的情况下,返回的变更集是: #Ecto.Changeset<action: :update, changes: %{password: "blabla", password_bcrypt: "$2b$12$s48wU....."}, errors: [password_confirmation: {"password incorrect", [validation: :confirmation]}, pass

我想根据具体的错误设置一个赋值,比如说,什么是最好的方法?在我的情况下,返回的变更集是:

#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>
#exto.Changeset
但也可以是:

#Ecto.Changeset<action: :update, changes: %{email: nil},
 errors: [email: {"can't be blank", [validation: :required]}],
 data: #Backend.AuthPersona<>, valid?: false>
#exto.Changeset
我需要根据返回的错误设置分配,以便激活表单中的适当选项卡

我试过这样的理解:

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

对于{:email,error}在注释部分进行了说明之后,您似乎想要为变更集的
errors
中存在的每个字段创建一个
{field}\u error
赋值。这可以通过
Enum.reduce
实现:

conn = Enum.reduce(changeset.errors, conn, fn {field, _}, conn ->
  assign(conn, :"#{field}_error", true)
end)
如果变更集包含三个字段,
foo
bar
、和
baz
,则上述内容相当于此:

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

您可以使用
if changeset.errors[:email]do
if changeset.errors[:validation]do
等检查密钥是否存在。这就是您想要的吗?类似于
conn=if changeset.errors[:email]do assign(conn,:email\u error,true)else conn
?因为我一次只能激活一个选项卡,所以可以将多个字段合并成一个
cond do
。因为我是新手,我也想知道最“灵丹妙药”的方法。所以你想为
错误中存在的每个字段分配
\u error
?假设
错误中有两个字段:
email
password
。在这种情况下,我想将
email\u error
password error
赋值为true。谢谢,这正是我想要的!