2011-10-22 27 views
3

我正在關注Rails教程,並且在註冊我的網站後,我正在嘗試登錄。我最近在我的應用程序中注意到,如果我大寫我的電子郵件地址,我會得到無效的用戶名/密碼信息。我在Rubular上測試了正則表達式,它使用大寫,所以不能這樣做。Rails教程區分大小寫不起作用

也許這個處理會話?

email_regex = /\A[\w+\-.][email protected][csupomona\d\-.]+[edu]+\z/i 

    validates :email, :presence => true, 
         :format  => { :with => email_regex }, 
         :uniqueness => { :case_sensitive => false } 

下面是會議的代碼/創建

def create 
     user = User.authenticate(params[:session][:email], 
          params[:session][:password]) 
    if user.nil? 
     flash.now[:error] = "Invalid email/password combination." 
     @title = "Sign in" 
     render 'new' 
    else 
     sign_in user 
     redirect_to root_path 
    end 
    end 

回答

5

這與驗證無關。 它與

  1. 如何電子郵件地址存儲在數據庫中(assumedly一些大寫字母,一些小寫)做
  2. 如何User.authenticate作品(我假設它確實User.find_by_email)

看着這個問題,我從來沒有真正遇到過這個問題。

但要解決這個問題,有幾種方法可以解決這個問題。

  1. 存儲的所有電子郵件小寫,使User.authenticate做同樣的
  2. 確保User.authenticate不區分大小寫。

但我有一種感覺,User.authenticateDevise或類似的東西來。所以1.可能是最好的解決方案

class User 

    # all email writes get lowercased 
    def email=(value) 
    self[:email] = value && value.downcase 
    end 

end 

user = User.authenticate(params[:session][:email].try(:downcase), ...) 
+0

非常感謝您的詳細解釋!我嘗試了方法#2,它工作。我從中學到了很多,謝謝! – Tony

5

你是一個有點困惑什麼的正則表達式是。讓我們看看這個:

validates :email, :presence => true, 
        :format  => { :with => email_regex }, 
        :uniqueness => { :case_sensitive => false } 

哪裏正在使用正則表達式?它被用於:format,因此正則表達式僅用於查看傳入的電子郵件地址是否看起來像一個有效的電子郵件地址,並且與唯一性無關。 :uniqueness參數validates指定在確保電子郵件地址唯一時不應考慮該情況。所以你不能有兩個用戶的電子郵件地址只有大小寫不同。

您所展示的代碼中沒有任何內容會談論您在嘗試簽署某人時的電子郵件地址比較方式,這就是您遇到問題的地方。您必須更新您的User.authenticate類方法才能對電子郵件地址執行不區分大小寫的搜索。

+0

非常有幫助的信息。非常感謝你的詳細解釋。我比預期的更多了! – Tony