【问题标题】:Phoenix/Elixir - validate_format() failing for integerPhoenix/Elixir - validate_format() 整数失败
【发布时间】:2018-04-21 19:11:10
【问题描述】:

在我的 Phoenix 应用程序中,我尝试在我的一个变更集上使用 validate_format() 以确保可选整数值不是负数(如果已提供)。但是,我在使用该方法时收到错误消息,我不确定自己做错了什么。

这是我的架构和变更集 - 因为 :duration 已经定义为整数,所以我真的只关心确保它不包含减号:

embedded_schema do
  field :content, :string
  field :title, :string
  field :duration, :integer

  timestamps()
end

def changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:id, :content, :title, :duration])
  |> validate_length(:title, max: 99, message: "Title must be less than 100 characters.")
  |> validate_format(:duration, ~r/[^-]\d+/)
end

例如,如果我尝试提交 -1 的值,则会返回错误:

** (FunctionClauseError) no function clause matching in Kernel.=~/2
    (elixir) lib/kernel.ex:1629: Kernel.=~(-1, ~r/[^-]\d+/)
    (ecto) lib/ecto/changeset.ex:1357: anonymous fn/5 in Ecto.Changeset.validate_format/4

有效值也会发生同样的错误。

我以前在字符串字段上使用过validate_format(),它工作得很好——我不知道我在这里做错了什么。谁能阐明处理此功能的正确方法?

【问题讨论】:

  • 这是因为您正在尝试验证一个整数,而validate_format 用于字符串?您可以使用 validate_number,hexdocs.pm/ecto/Ecto.Changeset.html#validate_number/3
  • 天啊,当然。我完全错过了。如果您将其发布为答案,我肯定会接受。

标签: elixir phoenix-framework ecto


【解决方案1】:

我相信validate_format 是另一个用例。对于您的特定问题,我会使用validate_number 例如:

def changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:id, :content, :title, :duration])
  |> validate_length(:title, max: 99, message: "Title must be less than 100 characters.")
  |> validate_number(:duration, greater_than: 0)
end

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2016-12-09
    • 1970-01-01
    • 2018-05-22
    • 2017-02-05
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多