2014-03-31 81 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

相关问题