Rails中的多种格式验证

时间:2012-03-27 17:08:11

标签: ruby-on-rails ruby-on-rails-3 validation

我有一个字段字符串foo,必须满足四个条件:

  • 必须是非空白
  • 所有记录必须是唯一的
  • 必须只包含字母,数字和超值
  • 不得以字符串“bar”
  • 开头

前两个由:presence:uniqueness验证处理。通过正则表达式:format验证可以轻松处理后两者。

是否可以包含多个:format验证规则,并且具有不同的:message值?

我想避免将这两个条件合并为一个正则表达式。除了多条消息之外,我认为如果它们不同,它们更容易阅读和写入。

理想情况下,我希望所有这些内容都包含在一个validates调用中,但这并非严格要求。

2 个答案:

答案 0 :(得分:17)

根据source code for the validates method,没有办法做到这一点;你得到一个:format密钥和一组选项作为哈希值。

然而,没有什么可以阻止我两次致电validates

validates :foo, 
  :presence => true, 
  :uniqueness => true,
  :format => {
    :with => /^[\w\-]*$/,
    :message => 'may only contain letters, digits, and hyphen'
  }
validates :foo, :format => { 
  :with => /^(?!bar)/, 
  :message => 'may not start with "bar"'
}

这似乎工作正常。

答案 1 :(得分:2)

一个验证可以嵌入多个属性,如Validator#validate source code。所以可以更清洁如下:

validates :foo, 
  :presence => true, 
  :uniqueness => true,
  :format => {`enter code here`
    :with => /^[\w\-]*$/,
    :message => 'may only contain letters, digits, and hyphen'
  },
  :format => { 
    :with => /^(?!bar)/, 
    :message => 'may not start with "bar"'
  }
}