【问题标题】:How to prevent nil values in Ecto Changeset?如何防止 Ecto Changeset 中出现 nil 值?
【发布时间】:2022-12-10 12:33:09
【问题描述】:

我有一个 update_changeset,我想在其中防止写入 nil 值。

我尝试添加一个validate_change

 def update_changeset(user, attrs) do
    user
    |> cast(attrs, [:full_name])
    |> validate_change(:full_name, fn :full_name, full_name ->
      if full_name == nil do
        [full_name: "cannot be blank"]
      else
        []
      end
    end)
  end

但是因为它只在存在非 nil 值时被调用,它仍然允许我将 full_name: nil 写入数据库。

我怎样才能使这项工作?

更新:这是我如何在研究员的帮助下实施的:

defp prevent_empty(changeset, fields) do
    Enum.reduce(fields, changeset, fn field, changeset ->
      value = get_field(changeset, field)

      if value in ["", nil] do
        add_error(changeset, field, "cannot be empty or blank")
      else
        changeset
      end
    end)
  end

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    必须在 Ecto.Changeset.add_error/4 的帮助下手动处理它。

    def update_changeset(user, %{full_name: fn} = attrs) do
      user
      |> cast(attrs, [:full_name])
      |> prevent_empty_full_name()
    end
    
    defp prevent_empty_full_name(%{changes: %{full_name: full_name}} = changeset)
        when full_name in ["", nil],
      do: add_error(changeset, :full_name, "empty")
    
    defp prevent_empty_full_name(changeset),
      do: changeset
    

    【讨论】:

    • 谢谢!我将使用我将使用的最终解决方案更新我的原始问题,它将多个字段作为列表:)
    【解决方案2】:

    尝试使用validate_required/3

    如果字段的值为 nil 或仅由空格组成的字符串, 变更集被标记为无效,该字段从 变更集的更改,并添加了一个错误。

     def update_changeset(user, attrs) do
        user
        |> cast(attrs, [:full_name])
        |> validate_required([:full_name])
      end
    

    【讨论】:

    • 谢谢,但问题是我希望能够在没有 :full_name 的情况下发送更新有效负载。使用validate_required,它使该字段成为必填字段。我只想检查它不能设置为nil
    • 所以你想允许一个空的""而不是nil
    • 是的,我希望两者都不允许。基本上它不能为空/空白以进行更新。
    • Gotcha - 看看 Aleksei 的回答。有时你必须自己操作 %Changeset{}
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-10-18
    • 2019-02-20
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多