2012-02-17 45 views
3

我正在構建一個應用程序,用戶可以在其中爲其配置文件創建url slugs。爲了確保蛞蝓是有效的我已經添加在用戶模型驗證的蛞蝓:簡單的rails格式驗證不會觸發

validates :slug, :uniqueness => true, :format => { :with => /[a-z]+/ }, :allow_nil => true, :allow_blank => true 

然而,驗證似傳,無論什麼格式的字符串蛞蝓,例如:

u.slug = 'jlskdf .jc oi/slkdjfie\*asdf&(*&*ss%&' 
=> "jlskdf .jc oi/slkdjfie\\*asdf&(*&*ss%&" 
u.save 
=> true 

顯然,我改變正則表達式並不重要,一切都過去了。我也嘗試過這種格式:

validates_format_of :slug, :with => /[a-z]+/ 

它給出了相同的結果。任何人有任何想法會發生什麼?

回答

1

您的正則表達式沒有錨定,所以只要它包含至少一個字母a-z,模式就匹配。其他任何內容都是有效的。將\A\z添加到開頭和結尾以防止匹配較大輸入內的任何子字符串。

:with => /\A[a-z]+\z/ 
+0

Ruby on Rails的正則表達式[安全指南(http://guides.rubyonrails.org/security.html#regular-expressions)現在建議你不要使用線開始和結束的驗證('^ '和'$'),這是一個安全威脅(可能會利用javascript)。改爲使用[string start/end](http://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-regular-expressions)作爲'\ A'和'\ z'。 – 2016-02-15 17:23:14

+0

@AndresEhrenpreis是的,謝謝你找到這個。我編輯過它。 – 2016-02-15 17:28:17