2013-02-15 103 views
2

我正與Chrome中的管理員用戶和另一個瀏覽器中的常規用戶一起工作。在我作爲管理員銷燬其中一位普通用戶後,我試圖在被銷燬的用戶正在使用的瀏覽器中重新打開該應用程序。不過,我得到這個錯誤消息銷燬用戶後清除會話

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答案,我發現,我試圖重置會話兩種不同的方式,但他們都重置管理員用戶的會話,而不是誰是破壞

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,但它不接受它們。

誰能告訴我如何清除被破壞的用戶會話?謝謝

+0

看來你可以只有用戶和你(用戶)即將清除Twitteruser的會話。那麼當你執行'session [:twitteruser_id] = nil'來清除你自己的會話時,怎麼可能呢? – 2013-02-15 22:03:23

+0

對不起,OP中的錯誤。沒有用戶,只有Twitteruser。我現在修好了。這不是會話問題的原因。 – Leahcim 2013-02-15 22:05:01

+0

該應用程序如何知道您是「Admin」?這是一個sign_out行動或Twitteruser刪除? – 2013-02-15 22:08:05

回答

4

這取決於你用什麼來支持你的會議。如果會話在Cookie中,那麼您的管理員無法使用它,因爲服務器端無法使用。無論如何,搞亂別人的會話可能是不可能的,因爲你不知道會話ID。

你想要做的是捕獲由find或使用find_by_id將返回零的ActiveRecord::RecordNotFound。當用戶嘗試通過引用已刪除用戶的會話訪問站點時,可以終止會話。

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 

不管這將工作的Twitteruser如何被刪除。例如,想象一下,如果您從沒有會話的軌道控制檯中刪除用戶。

+0

實際上,我正在使用MyApp :: Application.config.session_store:active_record_store。您是否介意更新您的答案以包含此場景的指示(但請留下已提供的信息,因爲我想從中學習)。謝謝,如果你可以多一點幫助。 – Leahcim 2013-02-15 22:15:46

+0

我附加了第一段。不管會話存儲如何,相同的答案都適用。 – Cluster 2013-02-15 22:22:00

+0

非常感謝。在第一個例子中,不應該將會話設置爲零?否則爲什麼它是一個替代reset_session – Leahcim 2013-02-15 22:30:59