6

मैंने भंडार का एक कांटा बनाया है ताकि 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 कुंजी है नहीं बदला

प्रश्न निम्नानुसार है, परिवर्तनों में हमेशा चेतावनियां रखने के लिए चेतावनियों की कार्यक्षमता को कैसे कार्यान्वित किया जाए, भले ही कोई परिवर्तन नहीं किया गया हो?

+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__ है सलाह दी, इसलिए अपने तर्क को एक्टो के डिफ़ॉल्ट तर्क से अलग करना बहुत आसान होगा।

आपकी सत्यापन को चेतावनियों की सूची में चेतावनियां नहीं जोड़नी चाहिए, लेकिन यदि आप ठीक है, तो आपको इसे एक और तरीके से कार्यान्वित करना होगा, आप इस सूची से पहले से ही मौजूदा चेतावनियों को हटा देंगे। इस तरह आप सुनिश्चित होंगे कि warningless पर आपका परिवर्तन ठीक है, क्योंकि इस सूची से सभी चेतावनियों को हटा दिया गया है और यह परिवर्तन में खाली परिवर्तनों के लिए पूरी तरह से काम करेगा।

संबंधित मुद्दे