Ecto 变更集添加多个错误
Ecto changeset add multiple errors
我有一个要在变更集中验证的配置映射。配置有多个键,每个键都有一些限制。
我可以 运行 在接收到数据时为它们中的每一个设置一个验证器,但这迫使我编写很多代码,这些代码可以更智能地完成,所以我 运行 宁一个循环和试图收集所有失败的验证,而不是 运行 一个一个地收集它们。
defp validate_config_flags(changeset) do
config = get_field(changeset, :config)
for {k, v} <- config do
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
end
end
changeset
end
Obv 我的问题是我 return changeset
即使某些字段失败并且我的问题与此相关。如何向结果添加多个错误 message/failed 验证,而不是在第一个 add_error
不知何故 returning?
大多数时候,当你想在 Elixir 中重复修改一个术语时,你正在寻找 Enum.reduce/3
:
defp validate_config_flags(changeset) do
Enum.reduce(get_field(changeset, :config), changeset, fn {k, v}, changeset ->
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
else
changeset
end
end)
end
此代码与您的代码相同,但它会在每一步跟踪 add_error
返回的新 changeset
,类似于以下 if Elixir有可变变量:
for {k, v} <- config do
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
changeset = add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
end
end
我有一个要在变更集中验证的配置映射。配置有多个键,每个键都有一些限制。
我可以 运行 在接收到数据时为它们中的每一个设置一个验证器,但这迫使我编写很多代码,这些代码可以更智能地完成,所以我 运行 宁一个循环和试图收集所有失败的验证,而不是 运行 一个一个地收集它们。
defp validate_config_flags(changeset) do
config = get_field(changeset, :config)
for {k, v} <- config do
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
end
end
changeset
end
Obv 我的问题是我 return changeset
即使某些字段失败并且我的问题与此相关。如何向结果添加多个错误 message/failed 验证,而不是在第一个 add_error
不知何故 returning?
大多数时候,当你想在 Elixir 中重复修改一个术语时,你正在寻找 Enum.reduce/3
:
defp validate_config_flags(changeset) do
Enum.reduce(get_field(changeset, :config), changeset, fn {k, v}, changeset ->
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
else
changeset
end
end)
end
此代码与您的代码相同,但它会在每一步跟踪 add_error
返回的新 changeset
,类似于以下 if Elixir有可变变量:
for {k, v} <- config do
if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do
changeset = add_error(changeset, :"#{k}", "Invalid value for `#{k}`")
end
end