2017-11-08 12 views
1

Phoenix 앱에서 변경 사항 중 하나에 validate_format()을 사용하여 선택적인 정수 값이 음수가 아닌지 확인했습니다. 그러나 메서드를 사용할 때 오류가 다시 발생하고 잘못된 작업을 수행할지 잘 모르겠습니다.Phoenix/Elixir - 정수에 실패한 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()을 사용했는데 잘 돌아갔습니다. 여기서 잘못하고있는 것을 말할 수는 없습니다. 누구든지이 기능을 처리하는 올바른 방법을 명확히 할 수 있습니까?

+3

당신이 정수를 검증하기 위해 노력하고와'validate_format' 문자열입니다 때문입니다? validate_number, https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_number/3 –

+0

오, 이런, 물론 사용할 수 있습니다. 나는 그것을 완전히 놓쳤다. 대답으로 게시하면 확실하게 받아 들일 것입니다. – skwidbreth

답변

1

나는 validate_format이 다른 사용 사례라고 믿습니다. 특정 문제에 대한 I는 예를 들어 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