ecto
フォークを作成してEcto.Changeset
モジュールを拡張し、チェンジセットに警告を追加する機能を追加しました。私はadd_warnings/4
関数を持っていて、この構造体の警告の簡単なリストとしてチェンジセットに警告を加えました。warnings: [{atom, {String.t, Keyword.t}}]
、errors
に似ています。 warnings
とerrors
の動作の違いは、エラーが発生するとデータは保持されませんが、警告が発生するとデータは保持されます。Ecto Changesetは警告機能を追加します
Ecto.Changeset
構造体は、キーwarnings
とwarningless?
で拡張:
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
キーがないので、私は警告なしでチェンジを得ました変更されませんでした。
変更が加えられていなくても、変更セットに警告を常に表示する警告機能を実装する方法は次のとおりです。
チェンジセット機能が表示されていません。おそらくあなたがしたいことは、['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)を追加します。しかし、これの目的は何ですか?警告時にデータを永続化したい場合は、チェンジセットを失い、ユーザーにメッセージを表示することはできません。 –