私のアプリケーションでは、ユーザーの確認プロセスがあります。ユーザーがサインアップは、4つの物事が起こるとき:Ruby on Railsのユーザー確認でパラメータが更新されない
- をaccount_status_idが
- (未確認)1に設定されているユーザーは、new_account_confirmation_tokenが
- 確認メールが生成され
- (今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
最初のコードセットがデータベースの行を更新するかどうか確認できますか?それは正しいように見えます。しかし、はい、私は想像して、current_userはメモリにあるので、それは更新されていません。セッション中にユーザーオブジェクト全体をシリアライズしていますか?一般的には、IDを保存し、要求に応じてクエリを実行すると、常に最新の情報が得られます。 – agmcleod
最初のメソッドは、データベースの行を更新しません。そして、私はセッション内のuser_idだけを保存しています。current_userオブジェクト全体ではありません。 – hoitomt