6

我創建了ecto存儲庫的一個分支來擴展Ecto.Changeset模塊,並且能夠向更改集添加警告。我想擁有一個add_warnings/4函數,它向變更集添加一個警告,作爲此結構的一個簡單的警告列表warnings: [{atom, {String.t, Keyword.t}}],類似於errorswarningserrors行爲之間的區別在於,發生錯誤時數據不會持久存在,但當發生警告時,數據將持續存在。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補充說:

@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: %{}, data: #Company.Booking<>, errors: [], 
valid?: true, warnings: [], warningless?: true> 

當我做出錯誤和警告的變化,我收到:

#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時,它可以正常工作,因爲它從該列表中刪除了所有警告,並且對於更改集中的空白更改完全適用。