2010-01-25 14 views

उत्तर

111

यदि आप ऐसा तरह numericality सत्यापन करने के लिए सशर्त जोड़ने आपका कोड काम करेगा:

class Transaction < ActiveRecord::Base 
    validates_presence_of :date 
    validates_presence_of :name 

    validates_numericality_of :charge, allow_nil: true 
    validates_numericality_of :payment, allow_nil: true 


    validate :charge_xor_payment 

    private 

    def charge_xor_payment 
     unless charge.blank?^payment.blank? 
     errors.add(:base, "Specify a charge or a payment, not both") 
     end 
    end 

end 
+0

यह एकदम सही जवाब कहा जाता है: इस उदाहरण में :description और :keywords क्षेत्रों जो इस में से एक खाली नहीं हो रहे हैं। धन्यवाद @Semanticart –

+0

कार्यक्षमता बहुत अच्छा काम करता है। लेकिन, मुझे फॉर्म पेज पर दिखाए गए त्रुटियां नहीं मिल सका। जब तक मैं अपने _form.slim पर '= @ invoice.errors [: base] [0]' जैसी कुछ नहीं करता। कोई सुझाव? –

9

रेल 3.

class Transaction < ActiveRecord::Base 
    validates_presence_of :date 
    validates_presence_of :name 

    validates_numericality_of :charge, :unless => proc{|obj| obj.charge.blank?} 
    validates_numericality_of :payment, :unless => proc{|obj| obj.payment.blank?} 


    validate :charge_xor_payment 

    private 

    def charge_xor_payment 
     if !(charge.blank?^payment.blank?) 
     errors[:base] << "Specify a charge or a payment, not both" 
     end 
    end 
end 
2
validate :father_or_mother 

#Father अंतिम नाम या माँ अंतिम नाम है के लिए उदाहरण अनिवार्य

def father_or_mother 
     if father_last_name == "Last Name" or father_last_name.blank? 
      errors.add(:father_last_name, "cant blank") 
      errors.add(:mother_last_name, "cant blank") 
     end 
end 

सरल उदाहरण से ऊपर आज़माएं।

7
class Transaction < ActiveRecord::Base 
    validates_presence_of :date 
    validates_presence_of :name 

    validates_numericality_of :charge, allow_nil: true 
    validates_numericality_of :payment, allow_nil: true 


    validate :charge_xor_payment 

    private 

    def charge_xor_payment 
     if [charge, payment].compact.count != 1 
     errors.add(:base, "Specify a charge or a payment, not both") 
     end 
    end 

end 

तुम भी 3 या उससे अधिक मूल्यों के साथ ऐसा कर सकते हैं:

if [month_day, week_day, hour].compact.count != 1 
31

मुझे लगता है कि इस रेल में और अधिक मुहावरेदार है 3+:

जैसे: मान्य के लिए कि user_name या email में से एक मौजूद है:

validates :user_name, presence: true, unless: ->(user){user.email.present?} 
validates :email, presence: true, unless: ->(user){user.user_name.present?} 
+18

यह "दोनों नहीं" मानदंडों को संभाल नहीं करता है –

0

मैंने नीचे दिए गए इस प्रश्न का उत्तर दिया।

validate :some_was_present 

    belongs_to :seo_customable, polymorphic: true 

    def some_was_present 
    desc = description.blank? 
    errors.add(desc ? :description : :keywords, t('errors.messages.blank')) if desc && keywords.blank? 
    end 
संबंधित मुद्दे