मैं दो मॉडल हैं: डिस्काउंट है और कई Businsses के अंतर्गत आता है।मैं कैसे before_save सहयोग से एक प्रमाणीकरण त्रुटि जोड़ सकते हैं कॉलबैक
मैं मान्य करने के लिए है कि एक डिस्काउंट हमेशा कम से कम एक व्यापार है, एक साथ एक अन्य शर्त (उदाहरण के active?
के लिए) के साथ चाहते हैं।
class Discount < ActiveRecord::Base
has_and_belongs_to_many :businesses,
before_remove: :validate_publish_status
def validate_publish_status(*arg)
if active? && businesses.count == 0
errors[:active] << 'discount with no business'
end
end
end
हालांकि यह काम नहीं करता (कोई सत्यापन त्रुटियों उठाया) और मैंने महसूस किया है क्योंकि यह केवल एक कॉलबैक, न कि एक मान्यता है कि यह शायद है: मैं निम्नलिखित की कोशिश की। मैं इसे कैसे कोड कर सकता हूं ताकि मैं errors
का उपयोग कर सकूं जैसे कि मैं कस्टम सत्यापन करता हूं?
नियंत्रक कार्रवाई (ajax के लिए) मेरे पास है:
def remove
@business = Business.find(params[:business_id])
if @business.in? @discount.businesses
@discount.businesses.delete(@business)
end
render json: @business.as_json(only: [:id, :type, :name, :address],
methods: [:city_name, :country_name]).
merge(paths: paths_for(@discount, @business))
rescue ActiveRecord::RecordInvalid # even tried the generic Exception
respond_to do |f|
f.json { render json: {error: $!.message}, status: 403 }
end
end
धन्यवाद, मैंने जांच की और यह विधि के माध्यम से भाग गया। अगर मैं 'त्रुटि' बढ़ाता हूं तो यह अपेक्षित त्रुटि को बढ़ाएगा। – lulalala
मैंने कुछ और जानकारी के साथ उत्तर अपडेट किया। लेनदेन को रोकने के लिए आप कॉलबैक में अपवाद उठाना चाहते हैं। ऐसा करने में आप शायद कार्रवाई को फिर से प्रस्तुत करने के लिए नियंत्रक में कुछ अपवाद हैंडलिंग करना चाहते हैं। – miked
आप निष्पादन को रोकने के लिए झूठी वापसी भी कर सकते हैं। "पूरी कॉलबैक श्रृंखला लेनदेन में लपेटी गई है। अगर कॉलबैक विधि से पहले कोई भी वास्तव में झूठा रिटर्न देता है या अपवाद उठाता है, तो निष्पादन श्रृंखला रोक दी जाती है और रोलबैक जारी किया जाता है; कॉलबैक के बाद ही अपवाद उठाकर इसे पूरा किया जा सकता है।" http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree