2011-10-22 14 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

これは検証とは関係ありません。 それはどのようにUser.authenticate作品(私はそれがUser.find_by_emailをすると仮定)

  • 電子メールアドレスをデータベース(仮に一部の大文字、一部の小文字)に格納されている方法

    1. で行うことです

      質問を見ると、私は実際にこれを問題にすることはありませんでした。

      しかし、これを解決するには、これを行う方法がいくつかあります。

      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のために使用されているので、正規表現は受信メールアドレスが有効なメールアドレスのように見えるかどうかを確認するためにのみ使用され、一意性とは関係ありません。 validatesへの:uniquenessパラメータは、電子メールアドレスが一意であることを確認する際には考慮しないことを指定しています。したがって、電子メールアドレスが大文字と小文字の区別だけで異なる2人のユーザーを持つことはできません。

    あなたが表示したコードの中に、誰かにサインインしようとしているときやそれが問題のある場所で電子メールアドレスを比較する方法については何も書かれていません。大文字と小文字を区別しない電子メールアドレスの検索を行うには、User.authenticateクラスのメソッドを更新する必要があります。

    +0

    非常に役立つ情報です。詳しい説明はありがとうございます。私は予想以上にそれを上回っています! – Tony

    関連する問題