Rails 3:将相同的验证规则应用于多个表字段

aL3*_*3xa 14 validation ruby-on-rails-3 rails-activerecord

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

我想这个很容易,但我是一个Rails新人/时髦人士,所以请原谅一个微不足道的问题.=)

Jon*_*osh 21

所以如果你说三个字段要验证:

:first_name
:last_name
:age
Run Code Online (Sandbox Code Playgroud)

你希望他们都得到验证吗?所以像这样:

validates_presence_of :first_name, :last_name, :age
Run Code Online (Sandbox Code Playgroud)

编辑: Rails中有许多不同的验证方法,它们非常灵活).对于您可以使用的字段的格式validates_format_of,然后使用正则表达式来匹配它.以下是匹配电子邮件的示例:

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
Run Code Online (Sandbox Code Playgroud)

我查看了Active Record Validations和Callbacks指南; 它提供了有关Active Record在验证方面提供的许多功能的全面见解.您也可以在这里查看文档.

  • 他们绝对不是微不足道的问题; 每个人都学会了这些东西,并会提出这些问题.许多编程文档的问题在于它们是由对这个主题有深入了解的人编写的,而这些东西都是落空的.但信息就在那里!你会比你想象的更快地骑Rails. (2认同)

Car*_*III 5

如果您使用任何内置验证(presence,length_of),则可以对多个属性应用单个验证,如下所示:

validates_presence_of :name, :email
Run Code Online (Sandbox Code Playgroud)

如果您有自定义逻辑,则可以创建一个验证器对象来存放代码并单独应用它

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
Run Code Online (Sandbox Code Playgroud)

请参阅:http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3/