2

Chromeの管理者ユーザーと別のブラウザの通常のユーザーを使用しています。管理者として通常のユーザーの1人を破棄した後、破棄されたユーザーが使用していたブラウザーでアプリケーションを再度開こうとしました。しかし、私はこのエラーメッセージを受け取りました

Couldn't find Twitteruser with id=2

したがって、ユーザーが破棄された後も、セッションはブラウザで存続します

セッションはこのように作成されました

 def create
  twitteruser = Twitteruser.from_omniauth(env["omniauth.auth"])
  session[:twitteruser_id] = twitteruser.id
  redirect_to twitterquestions_url, notice: "Signed in!"
end

application_controllerでは、現在のユーザーはこのように作成されています

   def current_user
         @current_user ||= Twitteruser.find(session[:twitteruser_id]) if    session[:twitteruser_id]
  end

これは破壊アクションです

 def destroy
    Twitteruser.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
 end

私が見つけた他のSOの回答に基づいて、2つの異なる方法でセッションをリセットしようとしましたが、どちらも、破棄されたユーザーではなく、管理者ユーザーのセッションをリセットしました。

 def destroy
    Twitteruser.find(params[:id]).destroy
    #1. session[:twitteruser_id] = nil destroys my own session, not deleted users
    #2. reset_session  #reset admin's session
    flash[:success] = "User destroyed."
    redirect_to twitterusers_url
 end

また、reset_sessionに引数を渡そうとしましたが、受け入れられません。

破壊されたユーザーのセッションをクリアする方法を教えてもらえますか?ありがとう

4

1 に答える 1

4

これは、セッションをバックアップするために何を使用しているかによって異なります。セッションがCookie内にある場合、サーバー側で作業するものがないため、管理者はそれを使用して何もできません。とにかく、セッションIDがわからないため、他の人のセッションをいじることができない場合があります。

あなたがしたいのはActiveRecord::RecordNotFound、findによってスローされたものをキャッチするか、nilを返すfind_by_idを使用することです。ユーザーが削除されたユーザーを参照しているセッションでサイトにアクセスしようとすると、セッションを強制終了できます。

def current_user
  @current_user ||= Twitteruser.find(session[:twitteruser_id]) if session[:twitteruser_id]
rescue ActiveRecord::RecordNotFound
  session[:twitteruser_id] = nil # or reset_session
end

また

def current_user
  @current_user ||= fetch_user(session[:twitteruser_id])
end

def fetch_user(id)
  Twitteruser.find_by_id(id) || reset_session unless id.nil?
end

これは、Twitterユーザーがどのように削除されるかに関係なく機能します。たとえば、セッションがないRailsコンソールからユーザーを削除した場合を想像してみてください。

于 2013-02-15T22:11:37.083 に答える