2011-08-31 117 views
1

我有一个Message.uuid场,我要添加验证的,其中包括:Rails验证使用正则表达式验证字符串?

支持:

  • 包括AZ,az,中间0-9
  • 破折号,但从来没有开始或结束在一个短跑。
  • 至少5%,不超过500个字符

什么是轨道写这些规则模型验证的最好方法?

感谢

UPDATE:

validates :uuid, 
    :length => { :within => 5..500 }, 
    :format => { :with => /[A-Za-z\d][-A-Za-z\d]{3,498}[A-Za-z\d]/ } 

有了这个失败

+0

您需要在'^'和'$'之间固定正则表达式,或者像'“@%#@#$ AAAAA @#%@#$”'这样的东西才会通过。 – meagar

+0

你也应该限制'format'验证器的范围;您目前试图验证长度两次,而像AAA这样的UUID会导致两个错误:一个是关于长度,另一个是关于格式。您可能只希望它导致“长度”错误。 – meagar

回答

6

我会离开长度确认多达validates_length_of验证有效的UUID,让你得到更具体的错误消息。这将为您做两件事:简化validates_format_of验证程序使用的正则表达式,并在uuid太短/长时提供长度特定的错误消息,而不是将长度错误显示为“格式”错误。

尝试以下操作:

validates_length_of :uuid, :within => 5..500 
validates_format_of :uuid, :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i 

您可以使用Rails 3两个验证组合成一个单一的validates

validates :uuid, 
    :length => { :within => 5..500 }, 
    :format => { :with => /^[a-z0-9][-a-z0-9]*[a-z0-9]$/i } 
+0

难道你错过了这里的帽子吗? –

+0

@Benoit我简单地记住了正则表达式中忽略大小写的'/ i'。 – meagar

+0

刚试过这个,但它似乎没有工作,它不断重定向。我粘贴了上面使用的代码。思考? – AnApprentice

2

用途:

validates :uuid, :format => {:with => /my regexp/} 

至于正则表达式,您已在another question中提出要求。