2012-05-04 13 views
0

私のアプリケーションでは、ユーザーの確認プロセスがあります。ユーザーがサインアップは、4つの物事が起こるとき:Ruby on Railsのユーザー確認でパラメータが更新されない

  1. をaccount_status_idが
  2. (未確認)1に設定されているユーザーは、new_account_confirmation_tokenが
  3. 確認メールが生成され
  4. (今CURRENT_USERが存在する)に署名されています新しいユーザーにnew_account_confirmation_tokenを含むリンクで送信されます

このメソッドで確認リンクを処理しようと最初に試みました。それは問題のないユーザーを見つけ、コードはupdate_attributesを流れます!ただし、account_statusは更新されませんでした。私が知ることは、current_userオブジェクトが存在するためです。したがって、更新しようとしているユーザーImはすでに「メモリ内に」あります。あれは正しいですか?

def new_account_confirmation 
    @title = "Account Confirmation" 
    logger.info("User is not logged in") 
    @user = User.find_by_new_account_confirmation_token(params[:confirm_id])  
    if @user 
     @user.update_attributes!(:account_status_id => 2) 
    else 
     redirect_to root_path 
    end 
    end 

私の回避策は次のとおりです。下のコードは動作しますが、なぜ上のコードが機能しないのかを知りたいのですが。 account_statusを更新しないのはなぜですか?

def new_account_confirmation 
    @title = "Account Confirmation" 
    if current_user 
     logger.info("User is logged in") 
     current_user.update_attributes!(:account_status_id => 2) 
    else 
     logger.info("User is not logged in") 
     @user = User.find_by_new_account_confirmation_token(params[:confirm_id])  
     if @user 
     @user.update_attributes!(:account_status_id => 2) 
     else 
     redirect_to root_path 
     end 
    end 
    end 
+0

最初のコードセットがデータベースの行を更新するかどうか確認できますか?それは正しいように見えます。しかし、はい、私は想像して、current_userはメモリにあるので、それは更新されていません。セッション中にユーザーオブジェクト全体をシリアライズしていますか?一般的には、IDを保存し、要求に応じてクエリを実行すると、常に最新の情報が得られます。 – agmcleod

+0

最初のメソッドは、データベースの行を更新しません。そして、私はセッション内のuser_idだけを保存しています。current_userオブジェクト全体ではありません。 – hoitomt

答えて

0

あなたの言うとおり、あなたのユーザーが「記憶中」であっても、それは更新しない理由ではありません。 current_user@userと同期していないので、あなたのアップデートは起こっていますが、あなたはそれを見ていないだけです。

@userが更新されていないことを確認する方法がわかりませんが、update_attributes!がエラーをスローしていない場合は保存されています。

+0

あなたにお返事ありがとうございます。それは意味をなさないが、それは起こっていない。私はレールコンソール(再ロード!私はそれをリフレッシュするために考えることができるすべてのもの)からDBをチェックしているし、ステータスを更新しません。 @userとcurrent_userがデータの2つの別々のインスタンスを参照しており、正しく同期していない可能性はありますか? – hoitomt

+0

あなたのコードの内容から、ユーザーがuser1としてログインしていてuser2の確認リンクをクリックすると、同期が外れているように見えます。 current_userが@userと等しいかどうかは決して確認しません。コードを実行した後、 'current_user'と' @ user'が何であるかを確認した後、チェックするのは簡単です。 – Dty

関連する問題