在我的应用程序中,我将多个自定义验证器保存在 app/validators 中,然后调用多个模型。
大多数情况下,我为基于正则表达式的验证执行此操作,例如电子邮件、手机等,基本上是我需要采用特定格式的自定义数据字符串。
例如:
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
record.errors[attribute] << (options[:message] || "is not a valid email format")
end
end
end
class IpValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/
record.errors[attribute] << (options[:message] || "is not a valid IP format")
end
end
end
这种方法的缺点是我有很多额外的文件,它们的代码几乎相同,这在大型应用程序中会很烦人。
是否有更好的方法(更 DRY)来定义基于正则表达式的验证,以便它们可以跨模型重用?