自定義驗證

你可以新增自己的驗證,新增從 ActiveModel::ValidatorActiveModel::EachValidator 繼承的新類。兩種方法都很相似,但它們的工作方式略有不同:

ActiveModel::Validatorvalidates_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::EachValidatorvalidate

如果你希望在單個引數上使用常用的 validate 方法使用新的驗證器,請建立一個繼承自 ActiveModel::EachValidator 的類並實現 validate_each 方法,該方法有三個引數:recordattributevalue

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 指南的更多資訊。