2010-11-28 11 views
3

私は、認証メソッドを持つユーザーモデルを持っています。rails dynamic find_byメソッドがクラスメソッド内で動作しない

モデルを使ってレールコンソールでテストすると、ユーザーをうまく作成できて、電子メールで検索して、このように完全にユーザーを返すことができます。今、私はこのような認証方法を呼び出し、

user = User.authenticate("[email protected]", "foobar") 

nilを私の認証方法が戻るにはユーザーにモデルを置くUSER文を返すようにしようとした場合

user = User.find_by_email("[email protected]") 

この

class User < ActiveRecord::Base 

    attr_accessor :password 
    attr_accessible :first_name, :last_name, 
        :email, :birth_date, :sex, 
        :password, :password_confirmation 


    def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 

    puts user #this returns nil so my class is never able to authenticate the user 

    return nil if user.nil? 
    return user if user.has_password?(submitted_password) 
    end 

end 
ようになります

私は何が問題なのか迷っています。この問題に目を向ける人もいるでしょう。

答えて

2

Classメソッド内でfind_byメソッドを使用する方法は問題ありません。それはうまくいくはずです。

出力がputsのものであることを確認してください。おそらく、あなたのメソッドの出力ではありません。 user.has_password?に誤りがある可能性があります。

代わりのputs、試してみてください。

p user 

...念のために。いずれかの場合

0

find_by_emailを呼び出す前に電子メールの値を確認しましたか?無効なスペースがある可能性がありますので、sqlログを確認してdbconsoleにコピーしてください。

0

この方法はnilを返します:

  • を可能性があり
  • has_password?もし戻っfalse、(コンソールでfind_by_email作品以来そう、)は、ユーザオブジェクトがありませんでした。

has_password?の方法が正しいことを行っていることを確認してください。

+0

これは本当の解決策でした。私はあなたの提案を見る前にそれを見つけました。いいですよ。 – mattwallace

+0

@mswallaceおそらくこの答えを受け入れる? –

0

私は回答者を見つけました...ジャンプしていくつかの解決策を提案してくれてありがとう。

上記のコードには含まれていなかった別の方法が「実際」の問題でした。

私の元々の質問については、このメソッドが機能していたことが判明しました。私はメソッドに渡していた文字列にタイプミスがありました。基本的に私は電子メールの最後に ".com"を残しました。

通常、シンプルなタイプミスは、問題を投稿して問題を解決し、あなたの提案を見ても、とても感謝しています。

関連する問題