2012-01-16 18 views
23
में कुछ सत्यापन विधि को छोड़

मैं रेल v2.3मॉडल

उपयोग कर रहा हूँ अगर मैं एक मॉडल है:

class car < ActiveRecord::Base 

    validate :method_1, :method_2, :method_3 

    ... 
    # custom validation methods 
    def method_1 
    ... 
    end 

    def method_2 
    ... 
    end 

    def method_3 
    ... 
    end 
end 

ऊपर दिखने वाला रूप में, मैं 3 कस्टम मान्यता तरीकों है , और मैं उन्हें मॉडल सत्यापन के लिए उपयोग करता हूं।

अगर मैं इस मॉडल कक्षा में एक और तरीका है जो निम्नलिखित की तरह मॉडल का एक नया उदाहरण गोल बचाने में कामयाब:

# "flag" here is NOT a DB based attribute 
def save_special_car flag 
    new_car=Car.new(...) 

    new_car.save #how to skip validation method_2 if flag==true 
end 

मैं, नई कार को बचाने के लिए इस विशेष विधि में method_2 का सत्यापन छोड़ चाहते हैं कुछ सत्यापन विधि को कैसे छोड़ें?

+0

क्या आपकी 'विशेष कार' में कोई विशेषता है जो इसे गैर-विशेष कारों से अलग कर सकती है? यह आसान बना देगा। – Dogbert

+1

क्या आप [सशर्त सत्यापन] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional- validation) दस्तावेज़ों पर गए हैं? –

+0

हाय, मैंने एक विशेष कार को बचाने के लिए विधि के लिए अपनी पोस्ट अपडेट की। असल में, मेरे पास विधि में "ध्वज" पैरामीटर पास है, और यदि "ध्वज" सत्य है, तो मैं विधि_2 –

उत्तर

46

अद्यतन इस

class Car < ActiveRecord::Base 

    # depending on how you deal with mass-assignment 
    # protection in newer Rails versions, 
    # you might want to uncomment this line 
    # 
    # attr_accessible :skip_method_2 

    attr_accessor :skip_method_2 

    validate :method_1, :method_3 
    validate :method_2, unless: :skip_method_2 

    private # encapsulation is cool, so we are cool 

    # custom validation methods 
    def method_1 
     # ... 
    end 

    def method_2 
     # ... 
    end 

    def method_3 
     # ... 
    end 
end 
फिर अपने नियंत्रक में

करने के लिए अपने मॉडल डाल:

def save_special_car 
    new_car=Car.new(skip_method_2: true) 
    new_car.save 
end 

आप अपने नियंत्रक में पैरामीटर चर के माध्यम से :flag हो रही है, तो आप उपयोग कर सकते हैं

def save_special_car 
    new_car=Car.new(skip_method_2: params[:flag].present?) 
    new_car.save 
end 
+0

कि' attr_writer' 'attr_accessor' होना चाहिए या आपको' अपरिभाषित स्थानीय चर या विधि 'skip_method' त्रुटि। या आप अपना खुद का पाठक फ़ंक्शन लिख सकते हैं जैसे 'skip_method?'। – Ashitaka

+0

@ अष्टिका अपडेट, धन्यवाद! – shime

+0

इस उत्तर के लिए धन्यवाद .. मैंने इसके लिए बहुत कुछ खोजा।किसी और के लिए जो इस पर आ सकता है, मुझे लगता है कि यदि आप ऐसा करते हैं तो आपको MassAssignment त्रुटि मिल जाएगी। आप ऐसा करने से त्रुटि से बच सकते हैं: 'new_car = car.new', 'new_car.skip_method_2 = पैराम्स [: ध्वज] .present?' – lnreddy

11

सशर्त मान्यता के बुनियादी उपयोग है:

class Car < ActiveRecord::Base 

    validate :method_1 
    validate :method_2, :if => :perform_validation? 
    validate :method_3, :unless => :skip_validation? 

    def perform_validation? 
    # check some condition 
    end 

    def skip_validation? 
    # check some condition 
    end 

    # ... actual validation methods omitted 
end 

अधिक जानकारी के लिए बाहर की जाँच करें डॉक्स।

अपने screnario करने के लिए इसे समायोजित करना:

class Car < ActiveRecord::Base 

    validate :method_1, :method_3 
    validate :method_2, :unless => :flag? 

    attr_accessor :flag 

    def flag? 
    @flag 
    end  

    # ... actual validation methods omitted 
end 

car = Car.new(...) 
car.flag = true 
car.save 
+0

दरअसल, ध्वज डीबी आधारित विशेषता नहीं है ... तो ... कोई और तरीका? –

+0

अद्यतन अद्यतन देखें जो तब गैर डीबी-आधारित एटिब्यूट का उपयोग करता है। –

-1

मौसम ध्वज के आधार पर झूठे का सच है, सत्यापन छोड़ करने के लिए विधि save(false) का उपयोग करें।

+3

'सहेजें (झूठा) 'पूरी सत्यापन को छोड़ देगा, केवल एक विधि नहीं। – shime

+0

इसके अलावा यह 'सेव (मान्य: झूठा)' है, नहीं 'सहेजें (झूठा) ' – Fritzz

+0

यह रेल में v save (झूठा)' है v2.3 – daslicious

0

अपने सत्यापन में ब्लॉक का उपयोग करें जैसे:

validates_presence_of :your_field, :if => lambda{|e| e.your_flag ...your condition}