2014-03-31 114 views
1

我使用正則表達式驗證的模型:ActiveRecord的驗證允許使用空格

class User < ActiveRecord::Base 
    EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    USER_REGEX = /[-\w]/i 

    validates :name, presence: true, length: { maximum: 16 }, format: { with: USER_REGEX } 
    validates :email, presence: true, uniqueness: true, format: { with: EMAIL_REGEX } 
end 

但是:名稱字段未正確驗證。如果我進入'控制檯'並創建一個User類的新實例,我可以設置:名稱爲包含空格和.valid的字符串?仍然返回true。如果我在irb中測試正則表達式,它不匹配任何空格。

演示:

$ rails c --sandbox 
... 
2.0.0-p451 :001 > u = User.new name: "hello world", email: "[email protected]" 
2.0.0-p451 :002 > u.valid? 
    User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 
=> true 

我使用Ruby 2.0.0-P451在Linux上,護欄4.0.4。

回答

0

您的正則表達式沒有錨定,並且沒有量詞。 /[-\w]/i匹配任何字符串匹配該正則表達式的任何字符

正確的正則表達式將是...

USER_REGEX = /\A[-\w]+\Z/i 

這將匹配字符串(\A)的開始,隨後一個或多個[-\w]實例(該+是量詞),然後字符串的結尾(\Z)。錨點是至關重要的;它們使正則表達式匹配整個字符串,或者什麼都不匹配。

+0

謝謝!這真的幫了我。它現在起作用了,但似乎'\ a'需要大寫('\ A')。 – elomatreb

相關問題