Phoenix / Elixir - validate_format()没有整数

时间:2017-11-08 22:35:12

标签: elixir phoenix-framework ecto

在我的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()它已经运行得很好 - 我不知道我在这里做错了什么。任何人都可以澄清处理这个功能的正确方法吗?

1 个答案:

答案 0 :(得分:3)

我相信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