2012-04-09 10 views
12

यहां मुझे एक पूर्ण सीधा सवाल होने की उम्मीद है, लेकिन मुझे मार्गदर्शिकाओं या अन्य जगहों में एक निश्चित उत्तर नहीं मिल रहा है।रेल 3 प्रमाणीकरण: उपस्थिति => झूठी

मेरे पास ActiveRecord पर दो विशेषताएं हैं। मैं बिल्कुल एक उपस्थित होना चाहता हूं और दूसरा शून्य या खाली स्ट्रिंग होना चाहता हूं।

मैं समकक्ष कैसे कर सकता हूं: उपस्थिति => झूठी? मैं यह सुनिश्चित करना चाहता हूं कि मूल्य शून्य है।

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 
# The two lines below fail because 'false' is an invalid option 
validates :first_attribute, :presence => false, :if => "!second_attribute.blank?" 
validates :second_attribute, :presence => false, :if => "!first_attribute.blank?" 

या शायद यह करने के लिए एक और अधिक सुरुचिपूर्ण तरीका है ...

मैं रेल चल रहा हूँ 3.0.9

+0

मुझे यकीन है कि आप की जरूरत नहीं कर रहा हूँ: उपस्थिति => बिल्कुल झूठी कोड के अंतिम दो पंक्तियों में । – creativetechnologist

+0

@creativetechnologist इसे किसी प्रकार की परीक्षा की आवश्यकता है। अगर मैं इससे छुटकारा पाता हूं: उपस्थिति सत्यापन, यह मुझे देता है: सी: /Ruby192/lib/ruby/gems/1.9.1/gems/activemodel-3। 0.9/lib/active_model/validations/validates.rb: 79: 'validates 'में: आपको कम से कम एक सत्यापन (ArgumentError) – LikeMaBell

+6

को रेल 4 के लिए ध्यान देने योग्य मूल्य की आवश्यकता है जिसे इसे' validates_absence_of' कहा जाता है। – mpowered

उत्तर

8
class NoPresenceValidator < ActiveModel::EachValidator                                       
    def validate_each(record, attribute, value)         
    record.errors[attribute] << (options[:message] || 'must be blank') unless record.send(attribute).blank? 
    end                   
end  

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 

validates :first_attribute, :no_presence => true, :if => "!second_attribute.blank?" 
validates :second_attribute, :no_presence => true, :if => "!first_attribute.blank?" 
0

प्रयास करें:

validates :first_attribute, :presence => {:if => second_attribute.blank?} 
validates :second_attribute, :presence => {:if => (first_attribute.blank? && second_attribute.blank?)} 

आशा है कि मदद करते हैं।

1

ऐसा लगता है: लंबाई => {: is => 0} मुझे जो चाहिए वह काम करता है।

validates :first_attribute, :length => {:is => 0 }, :unless => "second_attribute.blank?" 
+1

इसमें त्रुटि संदेश है "गलत लंबाई है (0 वर्ण होना चाहिए)"। एक कस्टम संदेश जोड़ सकते हैं "खाली होना चाहिए"। 'मान्य करता है: first_attribute,: length => {: is => 0,: message =>" खाली होना चाहिए "},: = =" second_attribute.blank? "' – tfentonz

3

कस्टम सत्यापन का उपयोग करें।

validate :validate_method 

# validate if which one required other should be blank 
def validate_method 
    errors.add(:field, :blank) if condition 
end 
23

एक वस्तु मान्य यदि और केवल यदि एक विशिष्ट विशेषता नहीं के बराबर है, तो आप "शामिल किए जाने के" बल्कि अपनी खुद की विधि बनाने की तुलना में उपयोग कर सकते हैं होना करने के लिए अनुमति के लिए।

validates :name, inclusion: { in: [nil] } 

यह 4 समाधान बहुत अधिक सुरुचिपूर्ण के लिए रेल 3. रेल है:

validates :name, absence: true 
संबंधित मुद्दे