2012-10-02 17 views
7

के लिए सत्यापन त्रुटियों को कैसे सेट कर सकता है मेरे पास 3 ActiveRecord फ़ील्ड के साथ एक फ़ॉर्म है। उन क्षेत्रों में से एक प्रकार की मूर्खतापूर्ण है, और राज्य-निर्भर सत्यापन आवश्यकताओं। (उदाहरण के लिए, यदि सेटअप सेटअप विज़ार्ड फॉर्म पर ऑब्जेक्ट बनाया जा रहा है, तो मैं केवल फ़ील्ड को मान्य करता हूं।)नियंत्रक मैन्युअल रूप से किसी निश्चित फ़ील्ड

ऑब्जेक्ट बनाने के लिए मेरे पोस्ट हैंडलर में, मैंने सोचा कि मैं त्रुटियों को कॉल कर सकता हूं। एक विशेष त्रुटि स्थिति

डालने के लिए जोड़ें
@foo = Foo.new(params[:foo]) 
if goofy_conditions(params[:foo][:goofy_field]) 
    @foo.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
end 
respond_to do |format| 
    if @foo.save 
    ... 
    else 
    ... redirect back to form (with error fields hilited) 

हालांकि, नियंत्रक में @ foo.errors.add() करना कुछ भी प्रतीत नहीं होता है ... यह सहेजने से रोकता नहीं है() यदि अन्य फ़ील्ड सत्यापन पास करते हैं।

मॉडल में कस्टम सत्यापन हैंडलर डालने का एक विकल्प है ... मुझे त्रुटियों का उपयोग करना पता है .add (: field, 'msg') ठीक काम करता है ... लेकिन उस स्थिति में मेरा नियंत्रक 'पास' कैसे हो सकता है सत्यापनकर्ता को यह जानकारी बताती है कि फ़ील्ड को सत्यापित करने की आवश्यकता है या नहीं।

+1

मॉडल पर एक nonpersisted attrbute शब्दों में कहें, का कहना है कि जादूगर, सेट उचित के रूप में और फिर बस इसे nrmal सत्यापन में उपयोग करें? –

उत्तर

12

यह मॉडल तर्क है। पर custom validations

class GoofyThing < ActiveRecord::Base 
    validate :goofy_attribute_is_goofy 

    def goofy_attribute_is_goofy 
    if goofy_conditions(self.goofy_field) 
     self.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
    end 
    end 
end 

तो यह किसी भी अन्य मान्यता की तरह काम करेंगे देखो।

संपादित

आप सशर्त :if विकल्प के साथ मान्य कर सकते हैं:

attr_accessible :via_wizard 
validate :goofy_attribute_is_goofy, :if => lambda { self.via_wizard } 

और अपने नियंत्रक में:

class WizardController < ApplicationController 
    before_filter :get_object, :set_wizard 

    #... 

    def get_object 
    @object = GoofyThing.find(params[:id]) 
    end 

    def set_wizard 
    @object.via_wizard = true 
    end 
end 
+0

आह! attr_accessible: via_wizard वह है जिसे मैंने याद किया। आपका बहुत बहुत धन्यवाद! – jpwynn

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