Вопрос:

Phoenix / Elixir - validate_format () не работает для целого числа

elixir phoenix-framework ecto

522 просмотра

1 ответ

3048 Репутация автора

В моем приложении 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()Ранее я использовал для строковых полей, и это работало очень хорошо - я не могу сказать, что я делаю здесь неправильно. Кто-нибудь может уточнить правильный способ справиться с этой функцией?

Автор: skwidbreth Источник Размещён: 08.11.2017 10:35

Ответы (1)


3 плюса

701 Репутация автора

Решение

Я считаю, что 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
Автор: Kociamber Размещён: 09.11.2017 01:29
Вопросы из категории :
32x32