2011-03-07 11 views
27

मुझे मिल गया है निम्नलिखित मॉडल:समस्या update_attributes को

guest_catering.update_attributes(:orderable => false) 

अतिथि खानपान:

class GuestCatering < ActiveRecord::Base 

    # Validation 
    validates :name, :presence => true 
    validates :order_number, :presence => true 
    validates :orderable, :presence => true 

end 

लेकिन जब मैं निम्न कोड के साथ एक मौजूदा GuestCatering अद्यतन करने के लिए कोशिश करता हूँ परिवर्तनीय एक वैध GuestCatering ऑब्जेक्ट है। guest_catering वस्तु, अपडेट के बाद त्रुटियाँ हैं उस तरह:

<{[:orderable, ["can't be blank"]]=>nil}> 

लेकिन जब मैं एक orderable => true गुजरती हैं, सब कुछ ठीक है और कोई त्रुटि है।

यहां क्या गलत है, मैं झूठी को ऑर्डर करने योग्य क्यों नहीं सेट कर सकता?

+0

इस प्रयास करें: guest_catering.update_attributes (: orderable => 0) – Ashish

+0

एक ही त्रुटि दिखाई – LeonS

उत्तर

39

आपका मॉडल वास्तव में वास्तव में बर्ताव कर रही है के रूप में आप यह बताया करने के लिए, validates :orderable, :presence => true

उसके उपयोग के द्वारा छोटे बिंदु एक बूलियन ध्वज की उपस्थिति मान्य नहीं है - यह true, nil या false होने जा रहा है - और रूबी दुनिया में , जब बुलियन तर्क की बात आती है तो शून्य और झूठे का वही अर्थपूर्ण मूल्य होता है।

आंतरिक रूप से, validates :presence लौटने के लिए चेक किए गए गुण के मूल्य पर निर्भर करता है जब blank? कहा जाता है। और, रेल में (ActiveSupport के साथ), false.blank?true के रूप में मूल्यांकन करता है - जिसका अर्थ है कि आपका क्षेत्र सत्यापन में विफल रहा है।

बस उस सत्यापन को हटा दें और सब कुछ अपेक्षित के रूप में काम करेगा।

+0

तो मैं एक बूलियन ध्वज मान्य नहीं कर सकता? – LeonS

+3

आप इसे कैसे सत्यापित करेंगे? यह या तो खुला है या बंद है। यदि आपने इसे सही करने के लिए _need_ किया है (जैसे शर्तों से सहमत), तो आप इसे लागू करने के लिए सत्यापन का उपयोग कर सकते हैं। आपके मामले में, यह आवश्यक प्रतीत नहीं होता है। –

+0

धन्यवाद इससे मुझे बहुत मदद मिली है, मैं एक समान परिस्थिति में था –

-1

के बजाय validates :presence => :true, तो आप इस तरह डिफ़ॉल्ट मान के साथ आपके माइग्रेशन लिखना चाहिए:

t.boolean :orderable, :default => 0 

मुझे लगता है अपने डिफ़ॉल्ट मान false होना चाहिए। यदि true, डिफ़ॉल्ट रूप से 1 का उपयोग करें। फिर यह डेटाबेस में डिफ़ॉल्ट मान सेट करेगा। तो, आप सत्यापन जांच को छोड़ सकते हैं।

कारण आप validates :presence का उपयोग नहीं कर सकते हैं @dan द्वारा उत्तर दिया गया है। उपस्थिति खाली नहीं का मतलब है और रेल इस के लिए .blank? समारोह का उपयोग करें और false.blank?true

19
दान Cheail तरह

उसके जवाब में पहले ही कहा, एक nil और false बूलियन शब्दार्थ एक ही बात है।

लेकिन, यदि आप वास्तव में इसे प्रमाणित करने के लिए (nil की अनुमति नहीं दे) की जरूरत है, तो आप हमेशा कर सकते हैं:

validates_inclusion_of :orderable, :in => [true, false]

+0

यदि आपके बूलियन के लिए आपका डेटाबेस कॉलम 'शून्य नहीं है', तो यह सही जवाब है क्योंकि यह रिकॉर्ड लिखने का प्रयास करने से पहले फ़ील्ड को मान्य करेगा। दूसरा उत्तर सत्यापन को 'शून्य' से गुजरने की अनुमति देगा, लेकिन कॉलम प्रतिबंध पर '। सेव' त्रुटि होगी। – dbcb

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