针对 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 个字段,foo
、bar
和 baz
,以上内容等同于:
conn = assign(conn, :foo_error, true)
conn = assign(conn, :bar_error, true)
conn = assign(conn, :baz_error, true)
我想根据具体的错误设置一个赋值 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 个字段,foo
、bar
和 baz
,以上内容等同于:
conn = assign(conn, :foo_error, true)
conn = assign(conn, :bar_error, true)
conn = assign(conn, :baz_error, true)