2009-10-23 8 views
55

में कस्टम सत्यापन विधियों को कॉल करना मैंने अभी अपनी रेल को 2.3.4 में अपग्रेड किया है और मैंने इसे सत्यापन के साथ देखा है: आइए कहें कि मेरे पास एक साधारण मॉडल कंपनी है जिसका नाम है। इसको कुछ नहीं।रेल

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

बचत मॉडल वास्तव में इस मामले में काम करता है: मैं अपने खुद के सत्यापन चलाना चाहते हैं। वही बात होती है यदि मैं मान्य() को ओवरराइड करता हूं और झूठी वापसी करता हूं। मैंने इसे एक और जटिल मॉडल में देखा जहां मेरा सत्यापन झूठा लौट रहा था, लेकिन ऑब्जेक्ट अभी भी सहेजा जा रहा था ... मैंने इसे अनिवार्य रूप से खाली मॉडल में देखा और एक ही चीज़ लागू हुई। क्या कोई नया अभ्यास है जो मुझे याद आ रहा है? यह मेरे कुछ पुराने रेल कोड में मामला प्रतीत नहीं होता है।

+0

धन्यवाद बदल दिया है। यह लगभग निश्चित रूप से मामला है। मैं नई परियोजना के साथ मानता हूं कि मैं त्रुटियों को जोड़ना भूल गया था, और पुराने लोगों के साथ मैं निश्चित रूप से वहां था। ओह। आप सभी को धन्यवाद। – cgr

उत्तर

107

जब आप validate विधि का उपयोग करते हैं तो आपके सत्यापन निष्पादित होते हैं। हालांकि रेल रिटर्न मूल्य पर निर्भर नहीं है।

यह मान्यताओं की त्रुटियों पर निर्भर करता है या नहीं। इसलिए जब आपका मॉडल मान्य नहीं होता है तो आपको त्रुटियां जोड़नी चाहिए।

def something 
    errors.add(:field, 'error message') 
end 

या, यदि त्रुटि एक क्षेत्र से संबंधित नहीं है:

def something 
    errors.add(:base, 'error message') 
end 

फिर क्योंकि त्रुटियां होने अपने मॉडल को सहेजा नहीं जाएगा।

+0

साफ करने के लिए इंगित करने के लिए धन्यवाद, धन्यवाद! यह सहायक है – marcgg

+0

add_to_base अब रेल 3 के रूप में सही नहीं है। @ MagedMakled का उत्तर देखें। – Undistraction

+0

मैंने अभी जवाब अपडेट किया है। धन्यवाद। –

14

आप सत्यापन और कॉलबैक के बीच भ्रमित हो रहे हैं।

ऑब्जेक्ट पर कोई त्रुटि होने पर मान्यताओं को विफल करना माना जाता है, इससे कोई फर्क नहीं पड़ता कि सत्यापन क्या होता है। अगर वे झूठी वापसी करते हैं तो कॉलबैक विफल हो जाते हैं, भले ही वे ऑब्जेक्ट में कोई त्रुटि जोड़ते हों।

रेल कॉल मान्य का उपयोग करता है? सेव कॉल से जो किसी भी सत्यापन के परिणाम की जांच नहीं करता है।

संपादित करें: रेल कॉलबैक के रूप में validate :method का व्यवहार करता है, लेकिन मान्य है? अभी भी उनके परिणामों की जांच नहीं करता है, केवल ऑब्जेक्ट में जोड़े गए त्रुटियों के लिए।

मुझे नहीं लगता कि यह व्यवहार बिल्कुल बदल गया है लेकिन मैं गलत हो सकता हूं। मुझे नहीं लगता कि मैंने कभी झूठी वापसी के लिए एक सत्यापन लिखा है।

+1

मैं new_records के लिए सत्यापन बनाने की कोशिश कर रहा था इसलिए मैंने कॉलबैक Obj.before_validation_on_create के साथ उपयोग करने के लिए एक विधि बनाई और कुछ आधार त्रुटियों को जोड़ा। हालांकि, ऑब्जेक्ट तब भी बनाया जाएगा जब मेरी कॉलबैक ने मूल त्रुटि जोड़ दी हो। यह केवल तभी काम करता था जब मैंने आपकी कॉलबैक वापसी "झूठी" की तरह सुझाव दिया था! कॉलबैक कैसे करें – Coderama

8

बस FYI errors.add_to_base('error message') रेल 3 में पदावनत किया गया है और द्वारा

errors[:base] << "Error message" 

या

errors.add(:base, "Error message")