* before_validation之前的validate_presence_of *

时间:2015-10-10 00:41:07

标签: ruby-on-rails validation

假设我有一个before_validation,它会检查以确保名称的第一个字母是“y”:

before_validation :check_name_first_letter_is_y

但我想确保第一个名字也存在:

validates :name, presence: true

但是这将在验证是否存在名字之前运行before_validation,对吧?在运行before_validate之前,如何检查名称是否存在?

我可以试试:

after_validation :check_name_first_letter_is_y

但如果我返回false,会停止save方法吗?或者为时已晚,因为它已经过验证?

2 个答案:

答案 0 :(得分:1)

在一次通话中执行此操作可能更容易,如下所示(如果我没有误读您的问题!):

validates :name, presence: ->(rec) { rec.name.initial == 'Y' }

更新:

引入一个新的ActiveModel::EachValidator,检查名称中的第一个字符是y并像往常一样使用在线验证器,但确保在name验证器之前出现在线验证器在检查第一个字母之前完成存在检查。

# app/validators/NameValidator.rb

class NameValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.initial != 'y'
      record.errors[attribute] << (options[:message] || "First letter in name must be `y`")
    end
  end
end

然后在您的模型中,使用以下两个验证:

validates :name, presence: true
valdiates :name, name: true

请参阅:http://api.rubyonrails.org/classes/ActiveModel/Validator.html

还建议你为NameValidator课程提出一个“Railsy”名称!

答案 1 :(得分:1)

您只需添加第二种格式验证:

validates :name, presence: true, format: { with: /^y/, allow_blank: true }