2016-04-25 34 views
3

在我user.rb模型中,我有一個email_confirm場,以便用戶插入兩次和驗證電子郵件,而不錯別字Rails驗證確認true不區分大小寫?

attr_accessor :email_confirmation 
validates :email, confirmation: true, on: :create 
validates :email_confirmation, presence: true, allow_nil: true 

但會發生什麼,如果我插入一封電子郵件,一個大寫字母,我得到一個驗證錯誤"don't match"。如何在不區分大小寫的情況下確認電子郵件?

我使用的設計

回答

1

對於電子郵件驗證,使用正則表達式匹配:

validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i 

i標誌在正則表達式的結尾設置不區分大小寫。此驗證也處理存在,因爲零或空白字符串將無法通過上述驗證。

我建議使用Rubular測試正則表達式:http://rubular.com/

編輯

你可以預處理在before_validation塊屬性:

before_validation :downcase_email 

def downcase_email 
    email_confirmation.try(:downcase!) 
    email.try(:downcase!) 
end 

try是防止調用downcase!如果電子郵件零。

+0

我使用Devise,它已經驗證了電子郵件的格式 – tvieira

+0

明白了,看到我更新的答案。 –

+0

是我最終以這種方式去:) – tvieira

1

我會用一個自定義的驗證:

class User < ActiveRecord::Base 

    attr_accessor :email_confirmation 

    validates :email, presence: true 
    validate :check_email_confirmation, if: :email_changed? 

    private 

    def check_email_confirmation 
    if email.casecmp(email_confirmation.to_s).nonzero? 
     errors.add(:email, "Emails don't match") 
    end 
    end 

end 

casecmp是不區分大小寫字符串比較方法。對於完全重音的UTF-8字符比較它無法正常工作,但在電子郵件中不需要。

使用此方法,您無需在驗證前以任何方式更改輸入屬性。此外,我更新了驗證,以便email是必需的屬性,並且確認檢查僅在電子郵件更改時完成。