मैंने भंडार का एक कांटा बनाया है ताकि Ecto.Changeset
मॉड्यूल को विस्तारित करने की क्षमता के साथ Ecto.Changeset
मॉड्यूल का विस्तार किया जा सके। मैं add_warnings/4
फ़ंक्शन चाहता था जो इस संरचना warnings: [{atom, {String.t, Keyword.t}}]
के साथ चेतावनियों की एक साधारण सूची के रूप में परिवर्तन को चेतावनी देता है, errors
के समान। warnings
और errors
के व्यवहार के बीच का अंतर यह है कि जब कोई त्रुटि होती है तो डेटा जारी नहीं होता है, लेकिन जब कोई चेतावनी होती है तो डेटा जारी रहता है।Ecto Changeset चेतावनियों के लिए कार्यक्षमता जोड़ें
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
Ecto कार्यों कास्टिंग के लिए, बदल रहा है, प्रसंस्करण पैरामीटर, आदि समायोजित:
Ecto.Changeset
struct कुंजी warnings
और warningless?
के साथ बढ़ाया। समारोह 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>
मैं किसी भी चेतावनी के बिना एक changeset मिला के रूप में वहाँ है क्योंकि डेटा changeset में कोई 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)। हालांकि, इसका उद्देश्य क्या है? यदि आप चेतावनी पर डेटा जारी रखना चाहते हैं, तो आप परिवर्तन खो देंगे और उपयोगकर्ता को एक संदेश दिखाने में सक्षम नहीं होंगे। –