2015-06-05 9 views
6

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

अभी मेरे पास है:

validates :segment_type, presence: true, inclusion: { in: SEGMENT_TYPES } 

मैं दो अलग सत्यापन में विभाजित इस की कोशिश की है इस प्रकार है:

validates :segment_type, presence: true 
validates :segment_type, inclusion: { in: SEGMENT_TYPES } 

लेकिन समस्या यह है, जब कोई मूल्य से ऊपर के प्रयास दोनों के लिए है segment_type फ़ील्ड में शामिल है, मुझे दोनों प्रतिक्रियाओं के लिए त्रुटि संदेश मिलते हैं:

Segment type can't be blank 
Segment type is not included in the list 

इस मामले में, मैं बस "सेगमेंट प्रकार खाली नहीं हो सकता" और दूसरा संदेश नहीं चाहता।

वहाँ किसी भी तरह से है कि मैं इस सशर्त मान्यता करते हैं और मुझे एक कस्टम समारोह को परिभाषित करने के बिना त्रुटि संदेशों में से वांछित झरना देने के लिए रेल बता सकते हैं, segment_type_presence_and_inclusion_check कि अनुक्रम में इन शर्तों की जाँच करता है कहते हैं और validate :segment_type_presence_and_inclusion_check के साथ बुला है?

उत्तर

6

एक ifinclusion विकल्प के अंदर में पास उपस्थिति

validates :segment_type, 
    presence: true, 
    inclusion: { in: SEGMENT_TYPES, if: :segment_type_present? } 

private 

def segment_type_present? 
    segment_type.present? 
end 

के लिए जाँच करने के लिए आप भी उपयोग कर सकते हैं एक proc

inclusion: { in: SEGMENT_TYPES, if: proc { |x| x.segment_type.present? } } 
+0

करता है 'शामिल किए जाने के साथ यह केवल काम पर allow_blank उपयोग करने के लिए सक्षम होना चाहिए:'? मैं कस्टम वैल्यूएटर के साथ 'समावेशन' को प्रतिस्थापित नहीं कर सकता हूं और इसलिए नीचे @ माइकल-डिसेन्ज़ा की विधि का उपयोग कर रहा हूं, लेकिन लगता है कि मॉडल पर 'मान्य:' को कॉल करके यह संभव होना चाहिए (केवल दो बार)। –

+0

नहीं, यह अन्य सत्यापन सहायकों के साथ काम करना चाहिए। आप जिस कोड को ठीक करने का प्रयास कर रहे हैं वह क्या है? – jvnill

+0

'मान्य करता है: शीर्षक, उपस्थिति: सत्य, लंबाई: {अधिकतम: 255}' 'मान्य करता है: शीर्षक, gener_url: सत्य, अगर: proc {| p | p.title.present? && p.title.length <= 255} ' मेरे पास' ऐप/वैधकर्ता' में 'जेनरेट यूआरएल वैधता' है। –

0

मुझे पता चला कि यह रूप में अच्छी तरह से काम करता है।

validates :segment_type, presence: true 
validates :segment_type, inclusion: { in: SEGMENT_TYPES }, if: "segment_type.present?" 
5

तुम भी शामिल किए जाने के सत्यापन

validates :segment_type, 
      presence: true, 
      inclusion: { in: SEGMENT_TYPES, allow_blank: true } 
+3

यह चिह्नित उत्तर से सरल और अधिक सुरुचिपूर्ण है। एफवाईआई भी 'allow_nil: true' देखता है। मुझे लगता है कि ये प्रासंगिक दस्तावेज़ हैं: http: // apidock।कॉम/रेल/सक्रिय मॉडल/सत्यापन/कक्षा विधि/ – s2t2

+0

मान्य करता है 'उपस्थिति: सत्य' यहां से आवश्यक नहीं है। साथ ही, 'allow_blank' को' समावेशन * के बाहर * के बाहर * होना चाहिए: {} 'विकल्प हैश। (Http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil) – MrYoshiji

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