2012-04-18 20 views
5

मेरे पास tryver_note, po_number और state_id के साथ एक चालान मॉडल है।स्कॉप्स स्थितियों के साथ रेल 3 सत्यापन

मैं सत्यापन जांच करने की आवश्यकता:

validates :approver_note, :presence => true, {:scope => state_id == 3} 
validates :po_number, :presence => true, {:scope => state_id ==2} 

तो, उपयोगकर्ता का चयन करता है, तो state_id = 3, वह एक टिप्पणी दर्ज करना होगा। यदि वह state_id = 2 का चयन करता है, तो उसे po_number दर्ज करना होगा।

कोई भी सहायता महान होगी ... धन्यवाद!

उत्तर

7

आप :scope के बजाय :if विकल्प की तलाश में हैं।

validates :approver_note, :presence => true, 
    :if => lambda { |invoice| invoice.state_id == 3 } 

लेकिन चूंकि एक लैम्ब्डा एक छोटे बदसूरत है, मैं शायद संपुटित करने के लिए क्या आप थोड़ा बेहतर कर रहे हैं एक विधि जोड़ेंगे:

validates :approver_note, :presence => true, :if => :requires_note? 
validates :po_number, :presence => true, :if => requires_po_number? 

def requires_note? 
    state_id == 3 
end 

def requires_po_number? 
    state_id == 2 
end 

आप वास्तव में अलग-अलग विशेषताओं का एक समूह है, तो आवश्यक हैं कि जब state_id 3, न सिर्फ एक नोट है, तो आप कुछ इस तरह कर सकते हैं:

validates :approver_note, :presence => true, :if => :green_state? 
validates :po_number, :presence => true, :if => orange_state? 

def green_state? 
    state_id == 3 
end 

def orange_state? 
    state_id == 2 
end 

(बदलें "हरी" के साथ - मुझे पता नहीं - "high_documentation" या जो कुछ भी अपनी दुनिया में समझ में आता है)

या हो सकता है आप राज्य तय यह क्या है बताना चाहते हैं:।

def green_state? 
    state.green? 
end 

यह वास्तव में अपने वास्तविक दुनिया के लिए और अधिक बारीकी से अपने कोड का पालन करना में शब्दावली बनाने के लिए मदद करता है "3" और "2" के विपरीत भाषा।

+0

+1 महान विवरण और विकल्प। –

+0

बिल्कुल सही, धन्यवाद! मैंने आपका दूसरा विकल्प इस्तेमाल किया, क्योंकि मुझे या तो लैम्बडा पसंद नहीं है। हालांकि, भले ही मुझे सही सत्यापन त्रुटि संदेश मिलते हैं, फिर भी रिकॉर्ड अभी भी अपडेट किया गया है। दूसरे शब्दों में, जब उपयोगकर्ता po_number दर्ज किए बिना स्वीकृति (state_id = 2) का चयन करता है, तो मुझे एक त्रुटि प्रदर्शित होती है, लेकिन रिकॉर्ड अभी भी invoice.state_id = 2 ... में अपडेट किया गया है ?? –

+0

हम्म, यह आपके नियंत्रक में शायद एक अलग समस्या की तरह लगता है। अगर सत्यापन विफल रहता है, तो ActiveRecord सहेजा नहीं जाएगा। आप इसे एक और प्रश्न के रूप में पोस्ट करना चाहते हैं, और अपनी नियंत्रक कार्रवाई शामिल कर सकते हैं। –

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