2012-04-03 10 views
0

私は自分のアプリケーションで電子メールの確認プロセスを設定しようとしています。登録時にトークンを生成し、ユーザーに電子メールを送ります。しかし、私が検証リンクをクリックすると、 'users_controller/confirm'アクションのif文とelse文の両方が実行されます。私はroot_pathにリダイレクトされていますが、ユーザーレコードの2つのフィールドが変更されています。レールコンソールからfind_by_tokenを実行すると、予想されるユーザーが返されます。私はmysqlを使用しており、クエリの実行に何らかの待ち時間があるかどうか疑問に思っています。ifとelse文を実行するRails

def confirm 
    if User.find_by_token(params[:token]).nil? 
     redirect_to root_path 
    else 
     @user = User.find_by_token(params[:token]) 
     cookies[:auth_token] = @user.auth_token 
     User.skip_callbacks = true 
     @user.update_attribute(:token, "") 
     @user.update_attribute(:confirmed, 1) 
     User.skip_callbacks = false 
     reset_session 
     redirect_to routes_path 
    end 
    end 
+0

これはほとんど起こりそうにないようです。私は条件付きの各ブランチにいくつかの出力を追加することをお勧めします。その結果、どちらが実行されるのかがわかります。 – MrTheWalrus

+0

はこのcut'n'pastedコードですか、それとも再入力しましたか? (私はちょうどあなたがタイプし直している場合はここにない実際のコードに入力ミスがあるのだろうかと思っています...) – Pavling

+0

合意 - このコードは期待通りに動作するはずです。実際のコードが微妙に異なる場合、 'redirect_to'を呼び出すことはアクションの実行を止めない*ことに注意してください。 – Thilo

答えて

2

あなたがこの方法をチェックして、この

before_filter :find_user 

    def confirm 
    #your action code 
    end 

    private 
    def find_user 
    @email = User.find_by_token params[:token].to_s 
    redirect_to root_path, notice: 'Your token is wrong!' if @email.nil? 
    end 

のようにリダイレクトするようにフィルタの前に使用することができ、あなたの行動のコードは、唯一の有効なレコードに対して実行されます。

+0

これは問題ではありませんでしたが、正しい軌道に乗りました。 elseブロックが実行され、クッキーが作成されていましたが、ヘルパーメソッドのためにトークンが空白に設定されるとすぐに破棄されました。ご協力いただきありがとうございます! – petfreshman