2012-01-30 10 views
7

मैं दो मॉडल हैं: डिस्काउंट है और कई 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 

उत्तर

8

before_remove कॉलबैक पर अपने वाक्य रचना हो सकता है या क्या सत्यापन विधि अपने आप में हो रहा है। आप यह भी देखने के लिए कॉलबैक विधि में कुछ डीबग कोड जोड़ना चाहेंगे कि यह वहां भी बना रहा है या नहीं।

* ध्यान दें कि लेन-देन ही अगर एक अपवाद कॉलबैक विधि में उठाया है रोक दिया जाएगा।

class Discount < ActiveRecord::Base 
    has_and_belongs_to_many :businesses, :before_remove => :validate_publish_status 

    def validate_publish_status(*args) 
    if yyy? && businesses.count == 0 
    errors.add(:yyy,'discount with no business') 
    raise "Unable to remove business." 
    end 
    end 

end 

नियंत्रक सार:

def update 
    @company.find(params[:id]) 
    if @company.update_attributes(params[:company]) 
     ... 
    else 
     render :action => 'edit' 
    end 
    rescue 
    render :action=>'edit' 
    end 

नोट Association Callback Documentation.

+0

धन्यवाद, मैंने जांच की और यह विधि के माध्यम से भाग गया। अगर मैं 'त्रुटि' बढ़ाता हूं तो यह अपेक्षित त्रुटि को बढ़ाएगा। – lulalala

+0

मैंने कुछ और जानकारी के साथ उत्तर अपडेट किया। लेनदेन को रोकने के लिए आप कॉलबैक में अपवाद उठाना चाहते हैं। ऐसा करने में आप शायद कार्रवाई को फिर से प्रस्तुत करने के लिए नियंत्रक में कुछ अपवाद हैंडलिंग करना चाहते हैं। – miked

+2

आप निष्पादन को रोकने के लिए झूठी वापसी भी कर सकते हैं। "पूरी कॉलबैक श्रृंखला लेनदेन में लपेटी गई है। अगर कॉलबैक विधि से पहले कोई भी वास्तव में झूठा रिटर्न देता है या अपवाद उठाता है, तो निष्पादन श्रृंखला रोक दी जाती है और रोलबैक जारी किया जाता है; कॉलबैक के बाद ही अपवाद उठाकर इसे पूरा किया जा सकता है।" http://guides.rubyonrails.org/active_record_validations_callbacks.html#halting-execution – amree

2

आप इस के लिए :presence => true साथ validates विधि का उपयोग कर सकते हैं।

class Discount < ActiveRecord::Base 
    has_and_belongs_to_many :businesses 
    validates :businesses, :presence => true 
end 

एक संघ सत्यापनकर्ता पर :presence => true का उपयोग करते हुए यह सुनिश्चित करेंगे कि संघ के कम से कम एक सदस्य मौजूद है।

+0

धन्यवाद के बाद से यह मामला है, तो आप शायद कार्रवाई फिर से प्रस्तुत करने के लिए अपने नियंत्रक में अपवाद तर्क को संभालने के लिए चाहता हूँ लेकिन मुझे उस सत्यापन में एक अतिरिक्त क्षेत्र की जांच करने की आवश्यकता है (yyy? part)। तो मुझे एक कस्टम सत्यापन लिखना होगा। – lulalala

+1

क्या आप कृपया अपना प्रश्न संपादित कर सकते हैं और इसके बारे में बेहतर विवरण प्रदान कर सकते हैं कि आप वास्तव में क्या देख रहे हैं? आप yyy के बारे में कुछ भी नहीं कहते हैं या यह आपके विवरण में क्या होना चाहिए, और यह वास्तव में आपके कोड से स्पष्ट नहीं है कि आप yyy के साथ क्या करने का प्रयास कर रहे हैं। –

+0

मेरा बुरा, मैंने yyy rephrased किया है? सक्रिय करने के लिए? लेकिन यह कोई मनमाना अभिव्यक्ति हो सकती है जो बुलियन का मूल्यांकन करती है। – lulalala

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