2017-08-02 57 views
0

我想做一個簡單的基於正則表達式的電子郵件驗證:Rails的理解不同的正則表達式,然後rubular

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文檔中提到

。 我已經在rubular和everythings中檢查過它的工作正常,但是在rails中,由於某種原因([email protected])帶有點在本地地址的電子郵件未通過驗證。奇怪的是它接受任何其他非空白字符(例如& ^%#!*(),當然不包括@)。

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 

而失敗的測試:

test 'should validate email with special characters in local address' do 
    @user.email = '[email protected]' 
    assert @user.valid? 
    end 

全user_test.rb

class UserTest < ActiveSupport::TestCase 
    def setup 
    @user = User.new(email: '[email protected]', 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 = '[email protected]' 
    assert_not @user.valid? 
    end 

    test 'should validate email with special characters in local address' do 
    @user.email = '[email protected]' 
    assert @user.valid? 
    end 

    test 'should not validate email with special characters in domain' do 
    @user.email = '[email protected]_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 

任何想法可能是對於怪異的行爲的原因是什麼?

+0

你確定這個特定的驗證失敗嗎?你只是檢查記錄是否有效。但是您可以特別檢查電子郵件驗證:assert @ user.errors [:email] .empty? (在@ user.valid之後?) – lightalloy

+0

我檢查過並且...它工作,很奇怪。但是,還是有問題的地方。我將編輯帖子並在那裏給出完整的代碼。 – Kappa

+0

我的意思是爲什麼它會是有效的用戶,並且在我更改電子郵件後它變爲無效,但沒有與電子郵件有關的錯誤 – Kappa

回答

0

我有決議。

我有相同的參數作爲夾具

@user = User.new(email: '[email protected]', password: 'password12', 
       first_name: 'John', last_name: 'Doe', 
       student_id: '112233') 

由於電子郵件必須是唯一的,它給我的電子郵件已經採取了一個錯誤。