2017-03-28 3 views
1

변경 세트 내부에서 유효성을 검사하려는 구성 맵이 있습니다. 구성에는 여러 개의 키가 있으며 각 키에는 몇 가지 제한 사항이 있습니다.Ecto changeset 다중 오류 추가

데이터를 받았을 때 각각에 대해 유효성 검사기를 실행할 수 있지만 이렇게하면 더 똑똑하게 수행 할 수있는 많은 코드를 작성해야하므로 루프를 실행하고 실행하지 않고 모든 실패한 유효성 검사를 수집하려고합니다. 하나씩.

defp validate_config_flags(changeset) do 
    config = get_field(changeset, :config) 

    for {k, v} <- config do 
     if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do 
      add_error(changeset, :"#{k}", "Invalid value for `#{k}`") 
     end 
    end 

    changeset 
end 

는 OBV 내 문제는 내가 특정 필드가 실패하고 내 질문은 그와 관련이 changeset에도 불구하고 반환한다는 것입니다. 처음에 add_error에 반환하는 대신 하나 이상의 오류 메시지/검증에 실패한 결과를 어떻게 추가합니까?

답변

3

당신이, 당신이 Enum.reduce/3을 찾고 반복적으로 비약의 용어를 수정하고자 할 때 시간의 대부분 :

defp validate_config_flags(changeset) do 
    Enum.reduce(get_field(changeset, :config), changeset, fn {k, v}, changeset -> 
    if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do 
     add_error(changeset, :"#{k}", "Invalid value for `#{k}`") 
    else 
     changeset 
    end 
    end) 
end 

이 코드는 당신과 동일하지만 add_error에 의해 반환되는 새로운 changeset를 추적

for {k, v} <- config do 
    if !Map.has_key?(@config_flags, k) || !validate_config_flag(k, v) do 
    changeset = add_error(changeset, :"#{k}", "Invalid value for `#{k}`") 
    end 
end 
+0

깔끔한 : 모든 단계에서 다음 과 유사 경우 비약은 가변 변수를했다! 고맙습니다! –