Rails 3:将相同的验证规则应用于多个表字段
问题描述:
我已经创建了一个应该接受相同数据格式(字符串,但可以是任何内容,FWIW)的几个字段的模型。我想将相同的验证规则应用于所有这些字段。当然,我可以继续复制/粘贴东西,但这会违反DRY原则,并且也是常识...Rails 3:将相同的验证规则应用于多个表字段
我想这个很容易,但我是一个Rails新手/时髦,所以excuse-moi为一个微不足道的问题。 =)
答
所以,如果你有说三场验证:
:first_name
:last_name
:age
你想他们都被验证?因此,像这样:
validates_presence_of :first_name, :last_name, :age
编辑:有Rails中许多不同的验证方法),他们是奇妙灵活)。对于字段的格式,您可以使用validates_format_of
,然后使用正则表达式与之匹配。下面是匹配邮件的例子:
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
我检查了Active Record Validations and Callbacks指南;它提供了有关Active Record在验证方面提供的许多功能的全面信息。您也可以查看文档here。
答
如果你使用任何内置的验证(存在,length_of),你可以申请一个验证多个属性是这样的:
validates_presence_of :name, :email
如果有自定义的逻辑,你可以创建一个验证器对象存放该代码,并单独应用它
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors[attribute] << (options[:message] || "is not an email") unless
value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
end
end
def Person
validates :home_email, :email => true
validates :work_email, :email => true
end
见:http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3/
答
使用Themis此:
# Describe common validation in module
module CommonValidation
extend Themis::Validation
validates_presence_of :foo
validates_length_of :bar, :maximum => 255
end
class ModelA < ActiveRecord::Base
# import validations
include CommonValidation
end
class ModelB < ActiveRecord::Base
# import validations
include CommonValidation
end
答
在Rails 4,你可以通过使用一个回路采用同样的验证,以多列:
[:beds, :baths].each do |column|
validates column, allow_blank: true, length: { maximum: 25 }
end
两个床和浴室都使用相同的验证验证。
编辑:
在Rails 4.2,你可以通过把多个符号只会验证函数调用后做同样的事情。例如:
validates :beds, :baths, allow_blank: true
是的,但是更奇特的东西呢,比如正则表达式比赛呢? – aL3xa 2012-03-20 20:54:32
我意识到这是多么愚蠢/简单。对不起,谢谢! =) – aL3xa 2012-03-20 20:55:04
没问题!我也提前并附上了一些细节/资源。如果您已将此答案作为解决方案发现,请点击我帖子旁边的图标以“接受”该答案。这将表明问题已关闭,您对我的帮助感到满意。 与学习轨道祝你好运! – 2012-03-20 21:01:56