2011-08-31 118 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中提出要求。