6

ectoフォークを作成してEcto.Changesetモジュールを拡張し、チェンジセットに警告を追加する機能を追加しました。私はadd_warnings/4関数を持っていて、この構造体の警告の簡単なリストとしてチェンジセットに警告を加えました。warnings: [{atom, {String.t, Keyword.t}}]errorsに似ています。 warningserrorsの動作の違いは、エラーが発生するとデータは保持されませんが、警告が発生するとデータは保持されます。Ecto Changesetは警告機能を追加します

Ecto.Changeset

構造体は、キーwarningswarningless?で拡張:

defstruct valid?: false, warningless?: false, data: nil, params: nil, changes: %{}, repo: nil, 
     errors: [], warnings: [], validations: [], required: [], prepare: [], 
     constraints: [], filters: %{}, action: nil, types: nil, 
     empty_values: @empty_values 

エクト鋳造するための機能、変更、処理パラメータ、等を調整しました。機能add_warnings/4、コメントを追加しました:私は、エラーや警告で変更を行う場合は

#Ecto.Changeset<action: nil, changes: %{}, data: #Company.Booking<>, errors: [], 
valid?: true, warnings: [], warningless?: true> 

は私が受け取る:

@spec add_warning(t, atom, String.t, Keyword.t) :: t 
def add_warning(%{warnings: warnings} = changeset, key, message, keys \\ []) when is_binary(message) do 
    %{changeset | warnings: [{key, {message, keys}}|warnings], warningless?: false} 
end 

結果は、私が期待キーでchangesetを受けるということです

#Ecto.Changeset<action: nil, 
changes: %{pickup_address: #Ecto.Changeset<action: :update, 
changes: %{street_name: nil}, data: #Company.Address<>, 
errors: [street_name: {"can't be blank", [validation: :required]}], 
valid?: false, 
warnings: [phone_number: {"This phone number is not common in Netherlands", 
    []}], warningless?: false>}, data: #Company.Booking<>, errors: [], 
valid?: false, warnings: [], warningless?: true> 

をので、警告に関しては、すべてが期待通りです。私は警告したが、エラーなしに変更を行うときに、私が受け取る:

#Ecto.Changeset<action: nil, 
changes: %{pickup_address: #Ecto.Changeset<action: :update, 
changes: %{street_name: "sss"}, data: #Company.Address<>, errors: [], 
valid?: true, 
warnings: [phone_number: {"This phone number is not common in Netherlands", 
    []}], warningless?: false>}, data: #Company.Booking<>, errors: [], 
valid?: true, warnings: [], warningless?: true> 

すべてが期待されます。私はまだ電話番号の警告を受けるべきフォームに変更を加えていないが、私は受け取った場合:

#Ecto.Changeset<action: nil, changes: %{}, data: #Company.Booking<>, errors: [], 
valid?: true, warnings: [], warningless?: true> 

データなぜならチェンジにはchangesキーがないので、私は警告なしでチェンジを得ました変更されませんでした。

変更が加えられていなくても、変更セットに警告を常に表示する警告機能を実装する方法は次のとおりです。

+0

チェンジセット機能が表示されていません。おそらくあなたがしたいことは、['Ecto.Changeset.get_field/3'](https://hexdocs.pm/ecto/Ecto.Changeset.html#get_field/3)を' 'Ecto.Changeset.get_change /3'](https://hexdocs.pm/ecto/Ecto.Changeset.html#get_change/3)を追加します。しかし、これの目的は何ですか?警告時にデータを永続化したい場合は、チェンジセットを失い、ユーザーにメッセージを表示することはできません。 –

答えて

0

あなたが作成することになり、各changeset関数の先頭に警告を事前移入するために検討すべきである - あなたがそこにplugを使用することはできませんので、あなたはあなたのために、このロジックを処理するマクロを書くために出てくることができ、__using__がありますあなたのロジックをEctoのデフォルトロジックと区別するのは非常に簡単です。

妥当性検査で警告リストに警告を追加するべきではありませんが、別の方法で実装する必要があります。フィールドが問題ない場合は、既存の警告をこのリストから削除します。そうすれば、変更リストがwarninglessのときにはこのリストからのすべての警告が削除され、チェンジセットの空の変更に対しては完全に機能するため、チェンジセットは正常です。

関連する問題