एक क्षेत्र या किसी अन्य की उपस्थिति (XOR)


91

मैं एक क्षेत्र या किसी अन्य की उपस्थिति को कैसे मान्य करूं लेकिन दोनों को और कम से कम एक को नहीं?

जवाबों:


154

यदि आप संख्यात्मकता मान्यताओं जैसे सशर्त को जोड़ते हैं तो आपका कोड काम करेगा:

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

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

45

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

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

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


11
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

10

रेल 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

# अंतिम नाम या माता का अंतिम नाम अनिवार्य है

 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

सरल उदाहरण के ऊपर प्रयास करें।


1

मैंने इस सवाल का जवाब नीचे दिया। इस उदाहरण में :descriptionऔर :keywordsऐसे क्षेत्र हैं जिनमें से एक रिक्त नहीं है:

  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

1

प्रोक या सिंबल का उपयोग करके सत्यापन : यदि और: जब तक सत्यापन होने से पहले सही नहीं कहा जाएगा।

तो दोनों क्षेत्रों में से एक की उपस्थिति इस तरह हो सकती है:

validates :charge,
  presence: true,
  if: ->(user){user.charge.present? || user.payment.present?}
validates :payment,
  presence: true,
  if: ->(user){user.payment.present? || user.charge.present?}

(उदाहरण स्निपेट) कोड में :ifया :unlessनवीनतम आइटम के रूप में है, हालांकि जैसा कि डॉक्टर में घोषित किया गया है, सत्यापन होने से पहले इसे सही कहा जाएगा - इसलिए स्थिति मिलान के बाद एक और जाँच काम करेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.