Ruby on Rails 5.2 - ActiveModel::Validator

वर्ग ActiveModel :: सत्यापनकर्ता




ruby

वर्ग ActiveModel :: सत्यापनकर्ता

जनक:
Object

सक्रिय मॉडल सत्यापनकर्ता

एक साधारण आधार वर्ग जिसका उपयोग ActiveModel::Validations::ClassMethods#validates_with के साथ किया जा सकता है ActiveModel::Validations::ClassMethods#validates_with

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

कोई भी वर्ग जो ActiveModel::Validator से विरासत में मिलता है ActiveModel::Validator को ActiveModel::Validator नामक एक विधि को लागू करना चाहिए जो एक record स्वीकार करता है।

class Person
  include ActiveModel::Validations
  validates_with MyValidator
end

class MyValidator < ActiveModel::Validator
  def validate(record)
    record # => The person instance being validated
    options # => Any non-standard options passed to validates_with
  end
end

सत्यापन त्रुटि का कारण बनने के लिए, आपको सत्यापनकर्ताओं के संदेश में सीधे record की त्रुटियों को जोड़ना होगा।

class MyValidator < ActiveModel::Validator
  def validate(record)
    record.errors.add :base, "This is some custom error message"
    record.errors.add :first_name, "This is some complex validation"
    # etc...
  end
end

प्रारंभिक विधि में व्यवहार जोड़ने के लिए, निम्नलिखित हस्ताक्षर का उपयोग करें:

class MyValidator < ActiveModel::Validator
  def initialize(options)
    super
    @my_custom_field = options[:field_name] || :first_name
  end
end

ध्यान दें कि सत्यापनकर्ता को केवल एक बार पूरे एप्लिकेशन जीवन चक्र के लिए आरंभीकृत किया जाता है, न कि प्रत्येक सत्यापन रन पर।

अलग-अलग विशेषताओं को मान्य करने के लिए कस्टम सत्यापनकर्ताओं को जोड़ने का सबसे आसान तरीका सुविधाजनक ActiveModel::EachValidator

class TitleValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add attribute, 'must be Mr., Mrs., or Dr.' unless %w(Mr. Mrs. Dr.).include?(value)
  end
end

यह अब validates विधि के साथ संयोजन में उपयोग किया जा सकता है (देखें ActiveModel::Validations::ClassMethods.validates इस पर अधिक के लिए ActiveModel::Validations::ClassMethods.validates )।

class Person
  include ActiveModel::Validations
  attr_accessor :title

  validates :title, presence: true, title: true
end

यह उस सत्यापनकर्ता का उपयोग करने के लिए उपयोगी हो सकता है जब उस सत्यापनकर्ता का उपयोग कर रहा हो, जब कोई पूर्वापेक्षाएँ मौजूद हों जैसे attr_accessor । यह वर्ग निर्माणकर्ता में options[:class] माध्यम से सुलभ है। अपने सत्यापनकर्ता को सेट करने के लिए निर्माणकर्ता को ओवरराइड करें।

class MyValidator < ActiveModel::Validator
  def initialize(options={})
    super
    options[:class].send :attr_accessor, :custom_attribute
  end
end

गुण

विकल्प [R]

पब्लिक क्लास के तरीके

# File activemodel/lib/active_model/validator.rb, line 103
def self.kind
  @kind ||= name.split("::").last.underscore.chomp("_validator").to_sym unless anonymous?
end

सत्यापनकर्ता का प्रकार देता है।

PresenceValidator.kind   # => :presence
AcceptanceValidator.kind # => :acceptance
नया (विकल्प = {}) स्रोत दिखाएं
# File activemodel/lib/active_model/validator.rb, line 108
def initialize(options = {})
  @options = options.except(:class).freeze
end

options पाठक के माध्यम से उपलब्ध कराए गए विकल्पों को स्वीकार करता है।

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

# File activemodel/lib/active_model/validator.rb, line 116
def kind
  self.class.kind
end

इस सत्यापनकर्ता के लिए तरह देता है।

PresenceValidator.new(attributes: [:username]).kind # => :presence
AcceptanceValidator.new(attributes: [:terms]).kind  # => :acceptance
सत्यापन (रिकॉर्ड) स्रोत दिखाएँ
# File activemodel/lib/active_model/validator.rb, line 122
def validate(record)
  raise NotImplementedError, "Subclasses must implement a validate(record) method."
end

सत्यापन तर्क के साथ उपवर्गों में इस विधि को ओवरराइड करें, जहां errors को रिकॉर्ड errors जोड़ दें जहां आवश्यक हो।