आप :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" के विपरीत भाषा।
स्रोत
2012-04-18 20:00:10
+1 महान विवरण और विकल्प। –
बिल्कुल सही, धन्यवाद! मैंने आपका दूसरा विकल्प इस्तेमाल किया, क्योंकि मुझे या तो लैम्बडा पसंद नहीं है। हालांकि, भले ही मुझे सही सत्यापन त्रुटि संदेश मिलते हैं, फिर भी रिकॉर्ड अभी भी अपडेट किया गया है। दूसरे शब्दों में, जब उपयोगकर्ता po_number दर्ज किए बिना स्वीकृति (state_id = 2) का चयन करता है, तो मुझे एक त्रुटि प्रदर्शित होती है, लेकिन रिकॉर्ड अभी भी invoice.state_id = 2 ... में अपडेट किया गया है ?? –
हम्म, यह आपके नियंत्रक में शायद एक अलग समस्या की तरह लगता है। अगर सत्यापन विफल रहता है, तो ActiveRecord सहेजा नहीं जाएगा। आप इसे एक और प्रश्न के रूप में पोस्ट करना चाहते हैं, और अपनी नियंत्रक कार्रवाई शामिल कर सकते हैं। –