2017-03-28 5 views
1

チェンジセット内で検証したい設定マップがあります。設定には複数のキーがあり、それぞれにいくつかの制約があります。エクトチェンジセット複数のエラーを追加

データを受け取ったときにそれぞれのバリデーターを実行することができましたが、これにより多くのコードを書くことができ、よりスマートに実行できるので、ループを実行していて、一つずつ。

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

端正:すべての段階で、次のと同様に場合エリクシールは、変更可能な変数を持っていました!ありがとうございました! –

関連する問題