自定义验证
你可以添加自己的验证,添加从 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 指南的更多信息。