首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails对regex的理解不同于rubular

Rails对regex的理解不同于rubular
EN

Stack Overflow用户
提问于 2017-08-03 02:11:24
回答 1查看 35关注 0票数 0

我想做一个简单的基于正则表达式的电子邮件验证:

代码语言:javascript
复制
class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([\S]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || 'is not an email')
    end
  end
end

这是在rails文档中提到的。我在rails中检查过,一切正常,但在rails中,本地地址中带圆点的电子邮件由于某种原因(john.doe@example.com)而无法通过验证。奇怪的是,它接受任何其他非空格字符(例如,&^%#!*(),当然不包括@)。

代码语言:javascript
复制
class User < ApplicationRecord
  validates :email,      presence: true, length: { maximum: 64 },
                         uniqueness: { case_sensitive: false }, email: true
  validates :password,   presence: true, length: { in: 8..64 }
  validates :first_name, length: { in: 2..16 }, allow_blank: true
  validates :last_name,  length: { in: 2..32 }, allow_blank: true
  validates :student_id, length: { in: 5..6 }, allow_blank: true,
                         numericality: true
end

和失败的测试:

代码语言:javascript
复制
  test 'should validate email with special characters in local address' do
    @user.email = 'john.doe@domain.com'
    assert @user.valid?
  end

整个user_test.rb

代码语言:javascript
复制
class UserTest < ActiveSupport::TestCase
  def setup
    @user = User.new(email: 'johndoe@domain.com', password: 'password12',
                     first_name: 'John', last_name: 'Doe',
                     student_id: '112233')
  end

  # Presence validation
  test 'user validate user' do
    assert @user.valid?
  end

  test 'should not validate empty email' do
    @user.email = ''
    assert_not @user.valid?
  end

  test 'should not validate blank password' do
    @user.password = '     '
    assert_not @user.valid?
  end

  test 'should validate blank first name' do
    @user.first_name = ''
    assert @user.valid?
  end

  test 'should validate blank last name' do
    @user.last_name = ''
    assert @user.valid?
  end

  test 'should validate blank student id' do
    @user.student_id = ''
    assert @user.valid?
  end

  # Length validation
  test 'should not validate too long email' do
    @user.password = 'a' * 65
    assert_not @user.valid?
  end

  test 'should not validate too long password' do
    @user.password = 'a' * 65
    assert_not @user.valid?
  end

  test 'should not validate too short password' do
    @user.password = 'a' * 7
    assert_not @user.valid?
  end

  test 'should not validate too long first name' do
    @user.first_name = 'a' * 17
    assert_not @user.valid?
  end

  test 'should not validate too short first name' do
    @user.first_name = 'a'
    assert_not @user.valid?
  end

  test 'should not validate too long last name' do
    @user.last_name = 'a' * 33
    assert_not @user.valid?
  end

  test 'should not validate too short last name' do
    @user.last_name = 'a'
    assert_not @user.valid?
  end

  test 'should not validate too long student id' do
    @user.student_id = '1234567'
    assert_not @user.valid?
  end

  test 'should not validate too short student id' do
    @user.student_id = '1234'
    assert_not @user.valid?
  end

  # Email format validation
  test 'should not validate email with wrong format' do
    @user.email = 'john.doe@domain'
    assert_not @user.valid?
  end

  test 'should validate email with special characters in local address' do
    @user.email = 'john.doe@domain.com'
    assert @user.valid?
  end

  test 'should not validate email with special characters in domain' do
    @user.email = 'john.doe@dom_ain.com'
    assert_not @user.valid?
  end

  # Numeric-only validation
  test 'should not validate student id with non-numeric characters' do
    @user.student_id = 'ab123c'
    assert_not @user.valid?
  end

  # Uniqueness validation
  test 'should not validate duplicated email' do
    @copycat_user = @user.dup
    @user.save
    assert_not @copycat_user.valid?
  end
end

你知道这种奇怪行为的原因是什么吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 04:05:34

我拿到解决方案了。

我的夹具的参数与

代码语言:javascript
复制
@user = User.new(email: 'johndoe@domain.com', password: 'password12',
                 first_name: 'John', last_name: 'Doe',
                 student_id: '112233')

由于电子邮件必须是唯一的,它给了我一个错误,即电子邮件已经被占用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45468124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档