ActiveRecord Validations允许空格

时间:2014-03-31 20:57:14

标签: ruby-on-rails ruby regex validation activerecord

我正在使用正则表达式验证模型:

class User < ActiveRecord::Base
  EMAIL_REGEX = /\A[\w+\-.]+@[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

但是,:name-field未正确验证。如果我进入'rails console'并创建User类的新实例,我可以将:name设置为包含空格和.valid的字符串?仍然返回true。如果我在irb中测试正则表达式,它与任何空格都不匹配。

示范:

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

我在Linux上使用Ruby 2.0.0-p451,使用rails 4.0.4。

1 个答案:

答案 0 :(得分:0)

您的正则表达式未锚定,并且没有量词。 /[-\w]/i匹配任何任何字符匹配该正则表达式的字符串。

正确的正则表达式是......

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

这将匹配字符串的开头(\A),然后是 [-\w]的一个或多个实例(+是量词)然后是字符串的结尾(\Z)。锚是至关重要的;它们使正则表达式匹配整个字符串,或者什么都不匹配。