Ruby on Rails 5.2 - ActiveModel::Validations::ClassMethods

मॉड्यूल ActiveModel :: सत्यापन :: ClassMethods




ruby

मॉड्यूल ActiveModel :: सत्यापन :: ClassMethods

सार्वजनिक प्रवृत्ति के तरीके

attribute_method? (विशेषता) स्रोत दिखाएं
# File activemodel/lib/active_model/validations.rb, line 272
def attribute_method?(attribute)
  method_defined?(attribute)
end

यदि attribute विशेषता विधि है, तो true , अन्यथा false

class Person
  include ActiveModel::Validations

  attr_accessor :name
end

User.attribute_method?(:name) # => true
User.attribute_method?(:age)  # => false
# File activemodel/lib/active_model/validations.rb, line 236
def clear_validators!
  reset_callbacks(:validate)
  _validators.clear
end

सत्यापनकर्ताओं और सत्यापन के सभी को साफ करता है।

ध्यान दें कि इससे कुछ भी स्पष्ट हो जाएगा जिसका उपयोग मॉडल को मान्य करने के लिए उपयोग किया जा रहा है। यह सत्यापनकर्ताओं को वैलिडेट_विथ के आह्वान और वेलेटबैक के एक आह्वान द्वारा निर्धारित कॉलबैक के साथ बनाया जाता है।

class Person
  include ActiveModel::Validations

  validates_with MyValidator
  validates_with OtherValidator, on: :create
  validates_with StrictValidator, strict: true
  validate :cannot_be_robot

  def cannot_be_robot
    errors.add(:base, 'A person cannot be a robot') if person_is_robot
  end
end

Person.validators
# => [
#      #<MyValidator:0x007fbff403e808 @options={}>,
#      #<OtherValidator:0x007fbff403d930 @options={on: :create}>,
#      #<StrictValidator:0x007fbff3204a30 @options={strict:true}>
#    ]

यदि कोई व्यक्ति Person.clear_validators! चलाता है Person.clear_validators! और फिर यह देखने के लिए जांचें कि इस वर्ग के पास क्या सत्यापनकर्ता हैं, आप:

Person.validators # => []

इसके अलावा, validate :cannot_be_robot द्वारा validate :cannot_be_robot मिटाया जाएगा ताकि:

Person._validate_callbacks.empty?  # => true
सत्यापित करें (* args, और ब्लॉक) दिखाएँ स्रोत
# File activemodel/lib/active_model/validations.rb, line 154
def validate(*args, &block)
  options = args.extract_options!

  if args.all? { |arg| arg.is_a?(Symbol) }
    options.each_key do |k|
      unless VALID_OPTIONS_FOR_VALIDATE.include?(k)
        raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{VALID_OPTIONS_FOR_VALIDATE.map(&:inspect).join(', ')}. Perhaps you meant to call `validates` instead of `validate`?")
      end
    end
  end

  if options.key?(:on)
    options = options.dup
    options[:on] = Array(options[:on])
    options[:if] = Array(options[:if])
    options[:if].unshift ->(o) {
      !(options[:on] & Array(o.validation_context)).empty?
    }
  end

  set_callback(:validate, *args, options, &block)
end

एक सत्यापन विधि जोड़ता है या कक्षा में ब्लॉक करता है। यह तब उपयोगी होता है जब validate आवृत्ति विधि को ओवरराइड करना बहुत अधिक कठिन हो जाता है और आप अपने सत्यापन की अधिक वर्णनात्मक घोषणा की तलाश में रहते हैं।

यह एक विधि को इंगित करने वाले प्रतीक के साथ किया जा सकता है:

class Comment
  include ActiveModel::Validations

  validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

एक ब्लॉक के साथ जिसे वर्तमान रिकॉर्ड के साथ मान्य किया जाना है:

class Comment
  include ActiveModel::Validations

  validate do |comment|
    comment.must_be_friends
  end

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

या उस ब्लॉक के साथ जहां सेल्फ रिकॉर्ड को मान्य किया जाना है:

class Comment
  include ActiveModel::Validations

  validate do
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

ध्यान दें कि सत्यापन विधियों का वापसी मूल्य प्रासंगिक नहीं है। मान्य कॉलबैक श्रृंखला को रोकना संभव नहीं है।

विकल्प:

  • :on - उन संदर्भों को निर्दिष्ट करता है जहां यह सत्यापन सक्रिय है। डिफ़ॉल्ट मान्यता द्वारा सभी सत्यापन संदर्भों में nil । आप एक प्रतीक या प्रतीकों की एक सरणी पास कर सकते हैं। (जैसे on: :custom_validation_context or on: [:create, :custom_validation_context] on: :custom_validation_context या on: [:create, :custom_validation_context] )

  • :if - यदि सत्यापन होना चाहिए, तो यह निर्धारित करने के लिए कॉल करने के लिए एक विधि, प्रोक या स्ट्रिंग निर्दिष्ट करें (जैसे if: :allow_validation , या if: Proc.new { |user| user.signup_step > 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :unless - कोई विधि निर्दिष्ट करने के लिए कॉल, स्ट्रिंग या कॉल करने के लिए यदि सत्यापन नहीं होना चाहिए (जैसे unless: :skip_validation , या unless: Proc.new { |user| user.signup_step <= 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

नोट: एक ही विधि पर कई बार validate कॉल validate पिछली परिभाषाएँ ओवरराइट हो जाएंगी।

सत्यापन (* विशेषताएँ) स्रोत दिखाएँ
# File activemodel/lib/active_model/validations/validates.rb, line 105
def validates(*attributes)
  defaults = attributes.extract_options!.dup
  validations = defaults.slice!(*_validates_default_keys)

  raise ArgumentError, "You need to supply at least one attribute" if attributes.empty?
  raise ArgumentError, "You need to supply at least one validation" if validations.empty?

  defaults[:attributes] = attributes

  validations.each do |key, options|
    next unless options
    key = "#{key.to_s.camelize}Validator"

    begin
      validator = key.include?("::".freeze) ? key.constantize : const_get(key)
    rescue NameError
      raise ArgumentError, "Unknown validator: '#{key}'"
    end

    validates_with(validator, defaults.merge(_parse_validates_options(options)))
  end
end

यह विधि सभी डिफ़ॉल्ट सत्यापनकर्ताओं और 'मान्यकर्ता' में समाप्त होने वाले किसी भी कस्टम सत्यापनकर्ता वर्ग का एक शॉर्टकट है। ध्यान दें कि डिफ़ॉल्ट सत्यापनकर्ता को विशिष्ट वर्गों में उनके स्थान पर कस्टम सत्यापनकर्ता कक्षाएं जैसे कि PresenceValidator बनाकर डिफ़ॉल्ट सत्यापनकर्ताओं को ओवरराइड किया जा सकता है।

डिफ़ॉल्ट रेल सत्यापनकर्ताओं का उपयोग करने के उदाहरण:

validates :terms, acceptance: true
validates :password, confirmation: true
validates :username, exclusion: { in: %w(admin superuser) }
validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
validates :age, inclusion: { in: 0..9 }
validates :first_name, length: { maximum: 30 }
validates :age, numericality: true
validates :username, presence: true

किसी validates विशेषता के लिए एक कॉल में कस्टम सत्यापनकर्ता और डिफ़ॉल्ट सत्यापनकर्ता का उपयोग करते समय validates विधि की शक्ति आती है।

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, (options[:message] || "is not an email") unless
      value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
  end
end

class Person
  include ActiveModel::Validations
  attr_accessor :name, :email

  validates :name, presence: true, length: { maximum: 100 }
  validates :email, presence: true, email: true
end

मान्य वर्गों को मान्य वर्ग के कस्टम मॉड्यूल को अनुमति देने के लिए मान्य किए जा रहे वर्ग के भीतर भी मौजूद हो सकता है।

class Film
  include ActiveModel::Validations

  class TitleValidator < ActiveModel::EachValidator
    def validate_each(record, attribute, value)
      record.errors.add attribute, "must start with 'the'" unless value =~ /\Athe/i
    end
  end

  validates :name, title: true
end

इसके अतिरिक्त सत्यापनकर्ता कक्षाएं किसी अन्य नामस्थान में हो सकती हैं और अभी भी किसी भी वर्ग के भीतर उपयोग की जा सकती हैं।

validates :name, :'film/title' => true

सत्यापनकर्ता हैश शॉर्टकट के रूप में नियमित अभिव्यक्तियों, श्रेणियों, सरणियों और तारों को भी संभाल सकते हैं।

validates :email, format: /@/
validates :gender, inclusion: %w(male female)
validates :password, length: 6..20

शॉर्टकट फॉर्म का उपयोग करते समय, रेंज और सरणियों को आपके सत्यापनकर्ता के options[:in] रूप में पास किया जाता है options[:in] जबकि नियमित अभिव्यक्ति और तार सहित अन्य प्रकारों को options[:with] रूप में पास किया जाता है।

विकल्पों की एक सूची भी है जिसका उपयोग सत्यापनकर्ताओं के साथ किया जा सकता है:

  • :on - उन संदर्भों को निर्दिष्ट करता है जहां यह सत्यापन सक्रिय है। डिफ़ॉल्ट मान्यता द्वारा सभी सत्यापन संदर्भों में nil । आप एक प्रतीक या प्रतीकों की एक सरणी पास कर सकते हैं। (जैसे on: :custom_validation_context or on: [:create, :custom_validation_context] on: :custom_validation_context या on: [:create, :custom_validation_context] )

  • :if - यदि सत्यापन होना चाहिए, तो यह निर्धारित करने के लिए कॉल करने के लिए एक विधि, प्रोक या स्ट्रिंग निर्दिष्ट करें (जैसे if: :allow_validation , या if: Proc.new { |user| user.signup_step > 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :unless - कोई विधि निर्दिष्ट करने के लिए कॉल, स्ट्रिंग या कॉल करने के लिए यदि सत्यापन नहीं होना चाहिए (जैसे unless: :skip_validation , या unless: Proc.new { |user| user.signup_step <= 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :allow_nil - सत्यापन छोड़ें यदि विशेषता nil

  • :allow_blank - सत्यापन को छोड़ दें यदि विशेषता रिक्त है।

  • :strict - अगर :strict विकल्प सही पर सेट है तो ActiveModel::StrictValidationFailed त्रुटि जोड़ने के बजाय। :strict विकल्प को किसी अन्य अपवाद पर भी सेट किया जा सकता है।

उदाहरण:

validates :password, presence: true, confirmation: true, if: :password_required?
validates :token, length: 24, strict: TokenLengthException

अंत में, विकल्प :if , :on :allow_blank :allow_nil :strict और :message एक विशिष्ट सत्यापनकर्ता को हैश के रूप में दिया जा सकता है:

validates :password, presence: { if: :password_required?, message: 'is forgotten.' }, confirmation: true
सत्यापित करता है! (* विशेषताएँ) स्रोत दिखाएँ
# File activemodel/lib/active_model/validations/validates.rb, line 146
def validates!(*attributes)
  options = attributes.extract_options!
  options[:strict] = true
  validates(*(attributes << options))
end

इस पद्धति का उपयोग उन मान्यताओं को परिभाषित करने के लिए किया जाता है जिन्हें अंतिम उपयोगकर्ताओं द्वारा सही नहीं किया जा सकता है और उन्हें असाधारण माना जाता है। इसलिए प्रत्येक सत्यापनकर्ता को धमाके के साथ परिभाषित किया गया :strict या true लिए निर्धारित :strict विकल्प हमेशा ActiveModel::StrictValidationFailed सत्यापन विफल होने पर त्रुटि जोड़ने के बजाय ActiveModel::StrictValidationFailed । सत्यापन के बारे में अधिक जानकारी के लिए सत्यापन देखें।

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates! :name, presence: true
end

person = Person.new
person.name = ''
person.valid?
# => ActiveModel::StrictValidationFailed: Name can't be blank
validates_each (* attr_names, & block) स्रोत दिखाएं
# File activemodel/lib/active_model/validations.rb, line 87
def validates_each(*attr_names, &block)
  validates_with BlockValidator, _merge_attributes(attr_names), &block
end

एक ब्लॉक के खिलाफ प्रत्येक विशेषता को मान्य करता है।

class Person
  include ActiveModel::Validations

  attr_accessor :first_name, :last_name

  validates_each :first_name, :last_name, allow_blank: true do |record, attr, value|
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
  end
end

विकल्प:

  • :on - उन संदर्भों को निर्दिष्ट करता है जहां यह सत्यापन सक्रिय है। डिफ़ॉल्ट मान्यता द्वारा सभी सत्यापन संदर्भों में nil । आप एक प्रतीक या प्रतीकों की एक सरणी पास कर सकते हैं। (जैसे on: :custom_validation_context or on: [:create, :custom_validation_context] on: :custom_validation_context या on: [:create, :custom_validation_context] )

  • :allow_nil - विशेषता nil सत्यापन छोड़ें।

  • :allow_blank - विशेषता रिक्त होने पर सत्यापन छोड़ें।

  • :if - यदि सत्यापन होना चाहिए, तो यह निर्धारित करने के लिए कॉल करने के लिए एक विधि, प्रोक या स्ट्रिंग निर्दिष्ट करें (जैसे if: :allow_validation , या if: Proc.new { |user| user.signup_step > 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :unless - कोई विधि निर्दिष्ट करने के लिए कॉल, स्ट्रिंग या कॉल करने के लिए यदि सत्यापन नहीं होना चाहिए (जैसे unless: :skip_validation , या unless: Proc.new { |user| user.signup_step <= 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

validates_with (* args, और ब्लॉक) दिखाएँ स्रोत
# File activemodel/lib/active_model/validations/with.rb, line 81
def validates_with(*args, &block)
  options = args.extract_options!
  options[:class] = self

  args.each do |klass|
    validator = klass.new(options, &block)

    if validator.respond_to?(:attributes) && !validator.attributes.empty?
      validator.attributes.each do |attribute|
        _validators[attribute.to_sym] << validator
      end
    else
      _validators[nil] << validator
    end

    validate(validator, options)
  end
end

निर्दिष्ट वर्ग या कक्षाओं के लिए रिकॉर्ड बंद कर देता है और उन्हें अधिक जटिल परिस्थितियों के आधार पर त्रुटियों को जोड़ने की अनुमति देता है।

class Person
  include ActiveModel::Validations
  validates_with MyValidator
end

class MyValidator < ActiveModel::Validator
  def validate(record)
    if some_complex_logic
      record.errors.add :base, 'This record is invalid'
    end
  end

  private
    def some_complex_logic
      # ...
    end
end

आप इसे कई वर्गों में भी पास कर सकते हैं, जैसे:

class Person
  include ActiveModel::Validations
  validates_with MyValidator, MyOtherValidator, on: :create
end

कॉन्फ़िगरेशन विकल्प:

  • :on - उन संदर्भों को निर्दिष्ट करता है जहां यह सत्यापन सक्रिय है। डिफ़ॉल्ट मान्यता द्वारा सभी सत्यापन संदर्भों में nil । आप एक प्रतीक या प्रतीकों की एक सरणी पास कर सकते हैं। (जैसे on: :custom_validation_context or on: [:create, :custom_validation_context] on: :custom_validation_context या on: [:create, :custom_validation_context] )

  • :if - यदि सत्यापन होना चाहिए, तो यह निर्धारित करने के लिए कॉल करने के लिए एक विधि, प्रोक या स्ट्रिंग निर्दिष्ट करें (जैसे if: :allow_validation , या if: Proc.new { |user| user.signup_step > 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :unless - कोई विधि निर्दिष्ट करने के लिए कॉल, स्ट्रिंग या कॉल करने के लिए यदि सत्यापन नहीं होना चाहिए (जैसे unless: :skip_validation , या unless: Proc.new { |user| user.signup_step <= 2 } )। विधि, प्रोक या स्ट्रिंग को true या false मान पर वापस लौटना या मूल्यांकन करना चाहिए।

  • :strict - निर्दिष्ट करता है कि क्या सत्यापन सख्त होना चाहिए। ActiveModel::Validations#validates! देखें ActiveModel::Validations#validates! अधिक जानकारी के लिए।

यदि आप कोई अतिरिक्त कॉन्फ़िगरेशन विकल्प पास करते हैं, तो उन्हें कक्षा में पास किया जाएगा और options रूप में उपलब्ध किया जाएगा:

class Person
  include ActiveModel::Validations
  validates_with MyValidator, my_custom_key: 'my custom value'
end

class MyValidator < ActiveModel::Validator
  def validate(record)
    options[:my_custom_key] # => "my custom value"
  end
end
सत्यापनकर्ता () स्रोत दिखाएं
# File activemodel/lib/active_model/validations.rb, line 194
def validators
  _validators.values.flatten.uniq
end

वे सभी सत्यापनकर्ताओं की सूची बनाएं जिनका उपयोग validates_with विधि के साथ मॉडल को मान्य करने के लिए किया जा रहा है।

class Person
  include ActiveModel::Validations

  validates_with MyValidator
  validates_with OtherValidator, on: :create
  validates_with StrictValidator, strict: true
end

Person.validators
# => [
#      #<MyValidator:0x007fbff403e808 @options={}>,
#      #<OtherValidator:0x007fbff403d930 @options={on: :create}>,
#      #<StrictValidator:0x007fbff3204a30 @options={strict:true}>
#    ]
validators_on (* विशेषताएँ) स्रोत दिखाएं
# File activemodel/lib/active_model/validations.rb, line 256
def validators_on(*attributes)
  attributes.flat_map do |attribute|
    _validators[attribute.to_sym]
  end
end

वे सभी सत्यापनकर्ता सूचीबद्ध करें जिनका उपयोग किसी विशिष्ट विशेषता को मान्य करने के लिए किया जा रहा है।

class Person
  include ActiveModel::Validations

  attr_accessor :name , :age

  validates_presence_of :name
  validates_inclusion_of :age, in: 0..99
end

Person.validators_on(:name)
# => [
#       #<ActiveModel::Validations::PresenceValidator:0x007fe604914e60 @attributes=[:name], @options={}>,
#    ]