我有这样简单的ApplicationRecord
类:
class User < ApplicationRecord
validates :name, presence: true
validates :surname, presence: true
end
现在我想修改我的代码,以便只有当其中一个字段存在时才必须存在字段。所以,我需要有类似的东西:
if name_is_present? || surname_is_present?
validate_name
validate_surname
else
#don't validate anything
end
我使用标准的Rails表单,因此如果表单无效,我希望显示与具体字段相关的自定义验证消息,就像它在标准验证中一样。我怎么能这样做?
答案 0 :(得分:2)
您可以通过在模型中创建自定义验证方法或创建验证程序类在Rails中创建自己的验证。
验证器的作用非常简单 - 您在模型上运行谓词,如果不满足,则向模型上的errors对象添加错误消息。
class User < ApplicationRecord
validate :name_or_surname
private
def name_or_surname
if name.present? || surname.present?
errors.add(:name, "must be present") unless name.present?
errors.add(:surname, "must be present") unless surname.present?
end
end
end
或作为验证员类:
class NameValidator < ActiveModel::Validator
def validate(record)
name, surname = record.name, record.surname
if name.present? || surname.present?
errors.add(:name, "must be present") unless name.present?
errors.add(:surname, "must be present") unless surname.present?
end
end
end
class User < ApplicationRecord
validates_with NameValidator
end
在旁注 - 使用 forename 而不是 name - 它是姓氏的伴随词,并且不含糊。
答案 1 :(得分:1)
class User < ApplicationRecord
validates :name, presence: true
validates :surname, presence: true, unless: :name_blank?
def name_blank?
name.blank?
end
end