如何让 Ecto.changeset validate_required 接受空白值?
How to make Ecto.changeset validate_required accept blank values?
我想做的是传递一个空字符串作为字段的值,并验证它以检查是否为 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
不幸的是 validate_required
的行为 hardcoded 将空字符串和空白字符串视为缺失。但是,您可以编写一个简单的函数来进行验证:
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
的字段添加错误。
我想做的是传递一个空字符串作为字段的值,并验证它以检查是否为 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
不幸的是 validate_required
的行为 hardcoded 将空字符串和空白字符串视为缺失。但是,您可以编写一个简单的函数来进行验证:
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
的字段添加错误。