【问题标题】:Ecto changeset add multiple errorsEcto 变更集添加多个错误
【发布时间】:2017-03-29 00:05:01
【问题描述】:

我有一个要在变更集中进行验证的配置映射。配置有多个键,每个键都有一些约束。

当接收到数据时,我可以为它们中的每一个运行一个验证器,但这迫使我编写很多可以更智能地完成的代码,所以我正在运行一个循环并尝试收集所有失败的验证,而不是运行它们一个减一。

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 我的问题是我返回changeset,即使某些字段失败并且我的问题与此有关。如何在结果中添加多个错误消息/验证失败,而不是在第一个 add_error 以某种方式返回?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    大多数情况下,当您想在 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,类似于以下如果 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
    

    【讨论】:

    • 整洁!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多