跳到內容 跳到搜尋

Active Model Validations

提供一個完整的驗證架構給您的物件。

一個最小的實作可以是

class Person
  include ActiveModel::Validations

  attr_accessor :first_name, :last_name

  validates_each :first_name, :last_name do |record, attr, value|
    record.errors.add attr, "starts with z." if value.start_with?("z")
  end
end

它提供您一個完整的標準驗證堆疊,您從 Active Record 中所知道的

person = Person.new
person.valid?                   # => true
person.invalid?                 # => false

person.first_name = 'zoolander'
person.valid?                   # => false
person.invalid?                 # => true
person.errors.messages          # => {first_name:["starts with z."]}

請注意,ActiveModel::Validations 會自動新增一個 errors 方法給您的實例,並初始化一個新的 ActiveModel::Errors 物件,因此您不需要手動執行此動作。

命名空間
方法
E
I
R
V
包含的模組

屬性

[RW] 驗證內容

執行個體公開方法

errors()

傳回包含所有屬性錯誤訊息資訊的 Errors 物件。

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates_presence_of :name
end

person = Person.new
person.valid? # => false
person.errors # => #<ActiveModel::Errors:0x007fe603816640 @messages={name:["can't be blank"]}>
# File activemodel/lib/active_model/validations.rb, line 330
def errors
  @errors ||= Errors.new(self)
end

invalid?(context = nil)

執行與 valid? 相反的動作。如果新增錯誤,傳回 true,否則傳回 false

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates_presence_of :name
end

person = Person.new
person.name = ''
person.invalid? # => true
person.name = 'david'
person.invalid? # => false

可以選擇提供內容,以定義要測試哪些回呼(內容在驗證中使用 :on 定義)。

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates_presence_of :name, on: :new
end

person = Person.new
person.invalid?       # => false
person.invalid?(:new) # => true
# File activemodel/lib/active_model/validations.rb, line 402
def invalid?(context = nil)
  !valid?(context)
end

valid?(context = nil)

執行所有指定的驗證,如果未新增任何錯誤,傳回 true,否則傳回 false

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates_presence_of :name
end

person = Person.new
person.name = ''
person.valid? # => false
person.name = 'david'
person.valid? # => true

可以選擇提供內容,以定義要測試哪些回呼(內容在驗證中使用 :on 定義)。

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates_presence_of :name, on: :new
end

person = Person.new
person.valid?       # => true
person.valid?(:new) # => false
別名為:validate
# File activemodel/lib/active_model/validations.rb, line 363
def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end

validate(context = nil)

別名為:valid?

validate!(context = nil)

執行指定內容中的所有驗證。如果未找到任何錯誤,傳回 true,否則引發 ValidationError

Validations 沒有 :on 選項時,無論在什麼情境下都會執行。有 :on 選項的 Validations 只會在指定的條件下執行。

# File activemodel/lib/active_model/validations.rb, line 411
def validate!(context = nil)
  valid?(context) || raise_validation_error
end

validates_with(*args, &block)

將記錄傳遞給指定的類別或類別,並允許它們根據更複雜的條件新增錯誤。

class Person
  include ActiveModel::Validations

  validate :instance_validations

  def instance_validations
    validates_with MyValidator
  end
end

請參閱類別方法文件,以取得更多關於建立您自己的驗證器的資訊。

您也可以傳遞多個類別,如下所示

class Person
  include ActiveModel::Validations

  validate :instance_validations, on: :create

  def instance_validations
    validates_with MyValidator, MyOtherValidator
  end
end

標準組態選項(:on:if:unless),這些選項在 validates_with 的類別版本中可用,應改為放在 validates 方法上,因為這些選項會在回呼中套用和測試。

如果您傳遞任何其他組態選項,這些選項會傳遞給類別,並作為 options 使用,請參閱此方法的類別版本,以取得更多資訊。

# File activemodel/lib/active_model/validations/with.rb, line 144
def validates_with(*args, &block)
  options = args.extract_options!
  options[:class] = self.class

  args.each do |klass|
    validator = klass.new(options.dup, &block)
    validator.validate(self)
  end
end

validation_context

執行驗證時,傳回情境。

這在執行驗證時很有用,但有特定的情境(與 on 選項相反)。

class Person
  include ActiveModel::Validations

  attr_accessor :name
  validates :name, presence: true, if: -> { validation_context != :custom }
end

person = Person.new
person.valid?          #=> false
person.valid?(:new)    #=> false
person.valid?(:custom) #=> true
# File activemodel/lib/active_model/validations.rb, line 49
      

實例私有方法

raise_validation_error()

# File activemodel/lib/active_model/validations.rb, line 445
def raise_validation_error # :doc:
  raise(ValidationError.new(self))
end