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
物件,因此您不需要手動執行此動作。
- 模組 ActiveModel::Validations::Callbacks
- 模組 ActiveModel::Validations::ClassMethods
- 模組 ActiveModel::Validations::HelperMethods
- 類別 ActiveModel::Validations::AcceptanceValidator
屬性
[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"]}>
來源:顯示 | 在 GitHub 上
# 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
來源:顯示 | 在 GitHub 上
# 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
來源:顯示 | 在 GitHub 上
# 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) 連結
執行指定內容中的所有驗證。如果未找到任何錯誤,傳回 true
,否則引發 ValidationError
。
Validations
沒有 :on
選項時,無論在什麼情境下都會執行。有 :on
選項的 Validations
只會在指定的條件下執行。
來源:顯示 | 在 GitHub 上
# 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
使用,請參閱此方法的類別版本,以取得更多資訊。
來源:顯示 | 在 GitHub 上
# 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
來源:在 GitHub 上
# File activemodel/lib/active_model/validations.rb, line 49
實例私有方法
raise_validation_error() 連結
來源:顯示 | 在 GitHub 上
# File activemodel/lib/active_model/validations.rb, line 445 def raise_validation_error # :doc: raise(ValidationError.new(self)) end