假设我有一个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方法吗?或者为时已晚,因为它已经过验证?
答案 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 }