मुझे एक ही समस्या है और समझ में नहीं आता कि इसके विचार को कैसे महसूस किया जाए। यहाँ मेरा कोड है:

नियंत्रक.आरबी

def update
  begin
    dot_applications = DotApplication.where(id: params[:ids])
    bad_dot_app_update = []
    dot_applications.each do |dot_application|
      if dot_application.update!(lead_source_id: resource_params[:lead_source_id])
        dot_application.update!(lead_source_id: resource_params[:lead_source_id])
      else
        bad_dot_app_update << dot_application.update!(lead_source_id: resource_params[:lead_source_id])
      end
    end

    render dialog: {
      close_dialog: true,
      success_message: "The lead source was changed for selected applicants."
    }
  rescue StandardError => error
    render dialog: {
      close_dialog: true,
      error_message: "Can't update lead sources because #{error.message}"
    }
  end
end

मैं अद्यतन नहीं 'dot_aplication' एकत्र करना चाहता हूं इसे सरणी में जोड़ें और इसे स्टैंडआर्ट एरर को बचाने के लिए डालें। कृपया मेरी मदद करें।

0
tandem tour 30 अगस्त 2018, 18:05
क्या आपको कोई त्रुटि मिल रही है? वैसे भी, जांचें कि क्या यह मदद करता है: stackoverflow.com/questions/3694153/…
 – 
iGian
30 अगस्त 2018, 18:17
मैंने नियंत्रक को अद्यतन किया। लेकिन मुझे यकीन नहीं है कि यह जो होगा वह सही काम करेगा।
 – 
tandem tour
30 अगस्त 2018, 18:23
पहली बार update! विफल होने पर आपका वर्तमान कोड "निरस्त" होगा - इसलिए अभी तक "सरणी में त्रुटियां जोड़ने" के साथ कुछ भी करने का कोई मतलब नहीं है (केवल 1 त्रुटि हो सकती है)। यदि कुछ DotApplication अपडेट करने में विफल रहते हैं, तो आप क्या व्यवहार चाहते हैं? उनमें से कोई भी अपडेट नहीं करें? या उनमें से कुछ को अपडेट करें?
 – 
Tom Lord
30 अगस्त 2018, 19:42

2 जवाब

आपको update! के बजाय update का उपयोग करना चाहिए क्योंकि जैसे ही कोई अपवाद पकड़ा जाता है, आपका कोड निष्पादन रोक दिया जाएगा और बचाव ब्लॉक पर पुनर्निर्देशित किया जाएगा। दूसरी ओर update विफलता पर केवल झूठा रिटर्न देता है।

कुछ इस तरह का प्रयास करें:

def update

  dot_applications = DotApplication.where(id: params[:ids])
  bad_dot_app_update = dot_applications.reject do |dot_app| # Reject element where updates are successfull
    dot_application.update(lead_source_id: resource_params[:lead_source_id])        
  end

  if bad_dot_app_update.any?
    # Here you can access the array and do whatever you want.
    errors = bad_dot_app_update.collect {|bad_dot_app| bad_dot_app.errors }
    # Collecting errors, only needs formating for printing
    render dialog: {
      close_dialog: true,
      error_message: "Can't update lead sources because #{error.message}"
    }
  else
    render dialog: {
      close_dialog: true,
      success_message: "The lead source was changed for selected applicants."
    }
  end
end
0
Pyos 30 अगस्त 2018, 20:33

यह काफी सरल तरीके से किया जाता है। अगर आप #update! पर कॉल करते हैं #update के बजाय कोड होगा पहला रिकॉर्ड विफल होने पर अपवाद उठाएं, बचाव ब्लॉक में कूदें (इस प्रकार रिकॉर्ड के आगे अद्यतन को रोकना)।

आप #update पर कॉल करके मनचाहा परिणाम प्राप्त कर सकते हैं। एक #group_by< के अंदर /a> ब्लॉक करें, रिकॉर्ड्स को उनकी सेव अवस्था के आधार पर समूहीकृत करें:

dot_applications = DotApplication.where(id: params[:ids])
saved = dot_applications.group_by do |dot_application|
  dot_application.update(lead_source_id: resource_params[:lead_source_id])
end

# Saved records will be in `saved[true]` unsaved records will be in
# `saved[false]`. If all records saved `saved[false]` will be `nil`. If none of
# the records saved `saved[true]` will be `nil`.

if saved[false]
  # some (or all) records didn't save
  unsaved_ids = saved[false].pluck(:id).join(', ')
  render dialog: {
    close_dialog: true,
    error_message: "The following selected applicants didn't save: #{unsaved_ids}"
  }
else
  # success
  render dialog: {
    close_dialog: true,
    success_message: "The lead source was changed for selected applicants."
  }
end
0
3limin4t0r 30 अगस्त 2018, 20:45