自定義驗證
你可以新增自己的驗證,新增從 ActiveModel::Validator
或 ActiveModel::EachValidator
繼承的新類。兩種方法都很相似,但它們的工作方式略有不同:
ActiveModel::Validator
和 validates_with
實現 validate
方法,該方法將記錄作為引數並對其執行驗證。然後在模型上使用 validates_with
和類。
# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'A'
record.errors[:name] << 'Need a name starting with A please!'
end
end
end
class Person < ApplicationRecord
validates_with StartsWithAValidator
end
ActiveModel::EachValidator
和 validate
如果你希望在單個引數上使用常用的 validate
方法使用新的驗證器,請建立一個繼承自 ActiveModel::EachValidator
的類並實現 validate_each
方法,該方法有三個引數:record
,attribute
和 value
:
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || 'is not an email')
end
end
end
class Person < ApplicationRecord
validates :email, presence: true, email: true
end
有關 Rails 指南的更多資訊。