erlang 如何使ECto.changeset validate_required接受空值?

yrwegjxp  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(160)

我尝试做的是传递一个空字符串作为字段的值,并验证它是否为nil。问题是validate_required在nil和空值时都会引发错误。如何使它接受空值?
纲要

schema "messages" do
    field :user_id, :string
    field :text, :string

    timestamps()
  end

变更集

def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:text, :user_id])
    |> validate_required([:text, :user_id])
  end
but5z9lq

but5z9lq1#

不幸的是,validate_required的行为是硬编码的,它认为空字符串和只有空格的字符串都是缺失的。

def changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:text, :user_id])
  |> validate_not_nil([:text, :user_id])
end

def validate_not_nil(changeset, fields) do
  Enum.reduce(fields, changeset, fn field, changeset ->
    if get_field(changeset, field) == nil do
      add_error(changeset, field, "nil")
    else
      changeset
    end
  end)
end

该函数遍历每个字段,为值为nil的每个字段添加错误。

bxjv4tth

bxjv4tth2#

https://github.com/elixir-ecto/ecto/issues/1684
即使这不能解决您的问题,在定义中添加一个默认值也可以让您创建一个完全避免空值的 * 解决方法 *,即使它不是您想要的。

相关问题