Ruby on rails 销毁用户后清除会话

Ruby on rails 销毁用户后清除会话,ruby-on-rails,Ruby On Rails,我和一个Chrome的管理员用户和另一个浏览器的普通用户一起工作。在我以管理员身份销毁一个普通用户后,我尝试在被销毁用户使用的浏览器中重新打开应用程序。但是,我收到了这个错误消息 Couldn't find Twitteruser with id=2 因此,在用户的会话被破坏后,会话仍然存在于浏览器中 def destroy Twitteruser.find(params[:id]).destroy #1. session[:twitteruser_id] = nil des

我和一个Chrome的管理员用户和另一个浏览器的普通用户一起工作。在我以管理员身份销毁一个普通用户后,我尝试在被销毁用户使用的浏览器中重新打开应用程序。但是,我收到了这个错误消息

Couldn't find Twitteruser with id=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
会话是这样创建的

 def create
  twitteruser = Twitteruser.from_omniauth(env["omniauth.auth"])
  session[:twitteruser_id] = twitteruser.id
  redirect_to twitterquestions_url, notice: "Signed in!"
end
   def current_user
         @current_user ||= Twitteruser.find(session[:twitteruser_id]) if    session[:twitteruser_id]
  end
在应用程序_控制器中,当前用户的创建方式如下

 def create
  twitteruser = Twitteruser.from_omniauth(env["omniauth.auth"])
  session[:twitteruser_id] = twitteruser.id
  redirect_to twitterquestions_url, notice: "Signed in!"
end
   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答案,我尝试用两种不同的方式重置会话,但它们都重置了管理员用户的会话,而不是被破坏的用户的会话

 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
我还试图传递一个参数来重置会话,但它不接受它们


有人能告诉我如何清除被破坏的用户会话吗?谢谢

这取决于您使用什么来支持会话。如果会话在Cookie中,那么您的管理员就无法处理它,因为服务器端没有可处理的内容。不管怎样,由于您不知道会话ID,因此可能无法干扰其他人的会话

您要做的是捕获find抛出的ActiveRecord::RecordNotFound,或者使用find_by_id返回nil。当用户尝试使用引用已删除用户的会话访问站点时,您可以终止该会话

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


无论Twitter用户如何被删除,这都会起作用。例如,假设您从没有会话的rails控制台中删除了该用户。

这取决于您用于支持会话的内容。如果会话在Cookie中,那么您的管理员就无法处理它,因为服务器端没有可处理的内容。不管怎样,由于您不知道会话ID,因此可能无法干扰其他人的会话

您要做的是捕获find抛出的ActiveRecord::RecordNotFound,或者使用find_by_id返回nil。当用户尝试使用引用已删除用户的会话访问站点时,您可以终止该会话

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



无论Twitter用户如何被删除,这都会起作用。例如,假设您从没有会话的rails控制台中删除了该用户。

您似乎是唯一的用户,并且您的用户即将清除Twitteruser的会话。那么,当您执行session[:twitteruser\u id]=nil时,如何清除您自己的会话?对不起,操作中出现错误。没有用户,只有twitteruser。我现在修好了。这不是会话问题的原因。应用程序如何知道您是管理员?这是注销操作还是删除Twitter用户?应用程序知道我是管理员,因为每个用户上都有一个管理员字段。删除用户链接仅对管理员布尔值设置为true的用户可见。因此,在Chrome浏览器中,我以管理员布尔值设置为true的用户身份登录,并从用户列表中删除另一个用户的帐户。似乎您只能是一个用户,并且您的用户即将清除Twitter用户的会话。那么,当您执行session[:twitteruser\u id]=nil时,如何清除您自己的会话?对不起,操作中出现错误。没有用户,只有twitteruser。我现在修好了。这不是会话问题的原因。应用程序如何知道您是管理员?这是注销操作还是删除Twitter用户?应用程序知道我是管理员,因为每个用户上都有一个管理员字段。删除用户链接仅对管理员布尔值设置为true的用户可见。因此,在Chrome浏览器中,我以管理员布尔值设置为true的用户身份登录,并从用户列表中删除另一个用户的帐户。实际上,我使用的是MyApp::Application.config.session_store:active_record_store。您是否介意更新您的答案以包括此场景的说明,但请留下已经提供的信息,因为我想从中学习。如果你能再帮我一点忙的话,谢谢你。我把第一段加上去了。同样的答案适用于任何会话存储。非常感谢。在您的第一个示例中,在rescue中会话不应该设置为零吗?否则,为什么它是会话重置_的替代方法?实际上,我没有尝试过的第二个示例第一个示例并没有达到预期的结果。作为使用Chrome浏览器的管理员,我销毁了用户。在Firefox中,我刷新浏览器,登录用户不再登录,因为它已被销毁。但如果我单击“使用Twitter登录”,则被销毁的用户可以重新登录,然后还会重新出现在管理员要在Chrome浏览器中销毁的用户列表中。当我说被销毁的用户可以重新登录时,我的意思是他可以这样做,而无需再次向Twitter授予权限。同样的事情发生在我刚刚测试的第一个解决方案上实际上,我正在使用MyApp::Application.config.session\u store:active\u record\u store。您是否介意更新您的答案,以包括此场景的说明,但请
我已经提供了信息,我想从中学习。如果你能再帮我一点忙的话,谢谢你。我把第一段加上去了。同样的答案适用于任何会话存储。非常感谢。在您的第一个示例中,在rescue中会话不应该设置为零吗?否则,为什么它是会话重置_的替代方法?实际上,我没有尝试过的第二个示例第一个示例并没有达到预期的结果。作为使用Chrome浏览器的管理员,我销毁了用户。在Firefox中,我刷新浏览器,登录用户不再登录,因为它已被销毁。但如果我单击“使用Twitter登录”,则被销毁的用户可以重新登录,然后还会重新出现在管理员要在Chrome浏览器中销毁的用户列表中。当我说被销毁的用户可以重新登录时,我的意思是他可以这样做,而无需再次向Twitter授予权限。我刚刚测试的第一个解决方案也会发生同样的情况