2013-08-09 11 views
38

मैं का उपयोग कर एक वस्तुओं के लिए एक सत्यापन कहा:"मान्य" और "मान्य" के बीच क्या अंतर है?

validate :field, presence: true 

मैंने पाया कि वे त्रुटि संदेश देना नहीं है। मैंने उन्हें validates में बदल दिया और त्रुटि संदेश प्राप्त किए। This ticket प्रासंगिक है।

मैं validates के साथ एक कस्टम सत्यापन जोड़ने की कोशिश की और एक त्रुटि मिली: validate को

You need to supply at least one validation 

मैं इसे बदल गया है, और उम्मीद के रूप में सब कुछ चला गया।

मेरी समझ सामान्य सत्यापन के साथ validates का उपयोग करना है, और validate कस्टम वाले के साथ है। क्या वह सही है? क्या मुझे कोई अन्य टुकड़ा पता होना चाहिए? क्या पहली समस्या को जोर से विफल करने का कोई तरीका है और केवल सबकुछ मान्य नहीं है?

+0

शायद एक कस्टम सत्यापन वाक्य रचना 'validate' है और अन्य सामान्य मान्यता है' validates' वाक्य रचना – Viren

+0

@Viren - मैं तो बस हूँ सोच रहा है कि क्या मुझे कुछ और याद आया। मैं दोनों की स्पष्ट व्याख्या नहीं पा रहा था और मुझे उम्मीद है कि एसओ प्रदान कर सकता है। मैं मानता हूं, यह एकमात्र अंतर है जिसे मैंने अभी तक पाया है। –

+0

मैंने उत्तर दिया कि यह प्रकाशगर के मुद्दे को ध्यान में रखे :) – Viren

उत्तर

54

मान्य करता है यह विधि सभी डिफ़ॉल्ट सत्यापनकर्ताओं और 'वैलिडेटर' में समाप्त होने वाले किसी भी कस्टम सत्यापनकर्ता वर्गों का शॉर्टकट है। ध्यान दें कि प्रिंस वैलिडेटर जैसे स्थान पर कस्टम सत्यापनकर्ता कक्षाएं बनाकर रेल डिफ़ॉल्ट डिफॉल्टेटर को विशिष्ट कक्षाओं के अंदर ओवरराइड किया जा सकता है।

validates :title, :body, :presence => true 

सत्यापित करें, एक सत्यापन विधि या वर्ग के लिए ब्लॉक जोड़ता है। यह उपयोगी है जब वैध उदाहरण विधि को ओवरराइड करना बहुत कमजोर हो जाता है और आप अपने सत्यापन की अधिक वर्णनात्मक घोषणा की तलाश में हैं।

validate :must_be_friends 

    def must_be_friends 
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee) 
    end 
+0

'जिज्ञासा' से बाहर कौन सा दस्तावेज़ आप लिंक संलग्न कर सकते हैं और आपने इसका परीक्षण भी किया है AFAIK यह काम नहीं करता – Viren

+0

मेरा जवाब संशोधित :) यह एक: http: // apidock .com/रेल/सक्रिय मॉडल/सत्यापन/कक्षा विधि/मान्यता मैंने उदाहरणों को कम पढ़ा है और यही वह है जो मैंने समझा, लेकिन ऐसा लगता है कि मैं गलत था। अधिक वर्णनात्मक लोग http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html – rmagnum2002

+1

ओह, मुझे "वैध सत्यापनकर्ता वर्ग" में समाप्त होने वाले कस्टम सत्यापनकर्ता वर्गों के बारे में पता नहीं था, यह जानना वाकई अच्छा है । यदि अन्य उत्तरों आते हैं तो मैं थोड़ा सा प्रश्न खुला छोड़ दूंगा, लेकिन मैं बाद में स्वीकार करने के लिए वापस आऊंगा। स्पष्टीकरण के लिए धन्यवाद! –

6

मेरा मानना ​​है कि :validate घोषणा के लिए कस्टम सत्यापन जहां :validates रूप presence, uniqueness etc एक क्षेत्र

validate विधि पैरामीटर के नाम के साथ एक विधि के लिए लग रहा है पर जैसे सामान्य सत्यापन के लिए प्रयोग किया जाता है प्रयोग किया जाता है, यानी यदि आप validate :field करते हैं तो यह

def field 

end 
आपके object पर

। चूंकि रेल प्रत्येक डेटाबेस fieldvalidate :field के लिए field की पाठक विधि को कॉल करने के लिए attr_accessor परिभाषित करता है।

मान्यता फ़ंक्शन true या अगर कोई एक error वस्तु है, यानी object.errors नहीं खाली है, तो वस्तु valid?

इसलिए ligthouse अंक में कारण माना जाता है, तो वे शिकायत करते हैं कि validatesilently bypasses सत्यापन :)

आशा इस मेकअप भावना

+0

आह, उस स्पष्टीकरण के लिए धन्यवाद! मैंने इस तरह से इस बारे में सोचा नहीं था, लेकिन यह पूरी तरह से समझ में आता है। यह भी बताता है कि क्यों आप 'वैध' विफल नहीं हो सकते हैं "जोर से" क्योंकि यह पूरी तरह से उचित है (कोई भी "वैध" कह सकता है ...) कॉल करने के लिए कॉल करें। मैंने ऐसा नहीं सोचा था। –

+0

** यह बेहद महत्वपूर्ण है। ** _Seriously_ अप्रत्याशित परिणाम एक वर्ण हैं। न केवल "गॉचा" पोस्ट करने के लिए धन्यवाद बल्कि इसके पीछे विज्ञान। चीयर्स! –

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