【问题标题】:ActiveRecord Validations allows spacesActiveRecord 验证允许空格
【发布时间】:2014-05-11 09:49:06
【问题描述】:

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

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 字段未正确验证。如果我进入“rails 控制台”并创建 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。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!这真的帮助了我。它现在可以工作了,尽管\a 似乎需要大写(\A)。
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2016-10-14
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多