2012-03-20 71 views
14

我已经创建了一个应该接受相同数据格式(字符串,但可以是任何内容,FWIW)的几个字段的模型。我想将相同的验证规则应用于所有这些字段。当然,我可以继续复制/粘贴东西,但这会违反DRY原则,并且也是常识...Rails 3:将相同的验证规则应用于多个表字段

我想这个很容易,但我是一个Rails新手/时髦,所以excuse-moi为一个微不足道的问题。 =)

回答

21

所以,如果你有说三场验证:

: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

+0

是的,但是更奇特的东西呢,比如正则表达式比赛呢? – aL3xa 2012-03-20 20:54:32

+0

我意识到这是多么愚蠢/简单。对不起,谢谢! =) – aL3xa 2012-03-20 20:55:04

+0

没问题!我也提前并附上了一些细节/资源。如果您已将此答案作为解决方案发现,请点击我帖子旁边的图标以“接受”该答案。这将表明问题已关闭,您对我的帮助感到满意。 与学习轨道祝你好运! – 2012-03-20 21:01:56

5

如果你使用任何内置的验证(存在,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/

1

使用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 
3

在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 
相关问题