erlang - 如何让 Ecto.changeset validate_required 接受空白值?

标签 erlang elixir phoenix-framework ecto changeset

我想要做的是传递一个空字符串作为字段的值,并验证它以检查是否不是 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 的字段添加错误。 .

关于erlang - 如何让 Ecto.changeset validate_required 接受空白值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45754213/

相关文章:

ruby - 通过编写代码翻译器来赋能语言 : why is it a bad idea?

visual-c++ - c_src\bcrypt_nif.c(94): error C2275: 'ERL_NIF_TERM' : illegal use of this type as an expression

error-handling - 在 Action 回退中使用相同的错误来区分错误 View

erlang - Elixir 的模块是一个原子吗?

elixir - phoenix框架全文检索

mapreduce - 使用大量读取在 Riak 中存储时间序列的最有效方法是什么

ssl - Erlang ssl : password option for private key

elixir - 用于调试的 IEx.pry 参数错误 :erlang. binary_to_integer

javascript - 使用 phoenix 应用程序安装的早午餐不适用于 Bower Assets

elixir - 当 Web 服务器应用程序位于伞形应用程序中时,通过早午餐导入 Phoenix Socket、Phoenix HTML JS 模块