2014-02-20 56 views
0

在使用Devise的3.2.16 Rails應用程序中,我們允許用戶保持登錄狀態數天。這意味着,當然,如果他們點擊了我們頁面的鏈接(比如在他們的書籤中),他們就會直接回到應用程序中(假設他們的會話仍處於活動狀態)。無法註銷並從已生成的佈局重定向到新頁面

對於我們的主屏幕上,我們有一個屈服佈局

... 
<body> 
    ... 
    <%= yield %> 
    ... 
</body> 

周圍產量的佈局包括除其他外的用戶名的顯示。

而且現在我有一個新的控制器:

class AccountSelectionsController < ApplicationController 
    def new 
    if user_signed_in? 
     sign_out current_user 
     current_user = nil 
    end 
    ... 
    render :layout => "external" 
    end 
    ... 
end 

當調用new行動,我希望用戶退出完全清除了會議,並採取了完全不同的佈局用戶。用例假定用戶通過鏈接(例如,電子郵件或我的應用程序外部的一個頁面(IOW,而不是來自我的應用程序內部的某個位置))來訪問此控制器。

我首先想到我只是做了一個sign_out current_user(如上),但沒有做任何顯而易見的:用戶似乎留簽署

以上只是我的出發點。我試過sign_out(沒有資源,暗示所有示波器),reset sessionredirect_to destroy_user_session_path(這是我們的標準註銷按鈕的作用,位於周圍佈局的按鈕)。

我得到的是我嘗試在舊佈局內渲染的新外部視圖(或正常的新會話登錄屏幕,取決於我嘗試的排列方式)(好像它是收益率的一部分)。

我可以嘗試設計after_sign_out_path_for來幫助重定向,但是我只想要它,如果它被綁定到這個特定的控制器和動作,我不太確定如何安全地完成。而現在我不相信它不會讓我包裹在周圍的佈局。 (1)是否有一個原因,即使在完整的redirect_to(即使使用:status => 301),我的主要佈局保持不變,我應該能夠擊敗(例如,是收益率干擾?)還是(2)我在Devise after_sign_out_path_for的正確軌道上,我需要做些什麼來限制這種行爲來響應這一個控制器操作?

謝謝! 理查德

UPDATE:被服務頁面(通過查看源)示出了目標屏幕體起源屏幕的佈局內包裹

UPDATE 2:我還試圖返回從head :reset_content一個before filter以及before_filter中的各種其他東西。舊的佈局在嘗試呈現新頁面之前仍然呈現。儘管我在測試中使用了不同的Chrome標籤(即會話保留在內存中)。我也試過它在Firefox中。同樣的結果。 rails s的輸出顯示了重定向,並沒有提示它首先嚐試通過另一個控制器,某些事情正在觸發佈局。有沒有在重定向中強制佈局?

+0

一個普通的'sign_out current_user'應該可以正常工作,你認爲可能有任何緩存正在進行,這給你一個錯覺,即用戶沒有正確登出? –

+0

我試着清理我的瀏覽器的本地緩存來檢查,似乎有同樣的問題,但這當然是一個合理的事情仍然考慮。它確實感覺像是一個緩存問題... – rdnewman

+0

除了清除本地緩存,還可以嘗試清除rails緩存,以防在應用程序中使用緩存'Rails.cache.clear' –

回答

0

所以這是我張貼的問題苦修。

我剛纔發現一個before_filter正在攔截對控制器的調用,並在登錄被檢查之前將其重定向到錯誤的佈局。通常這對於這個特定的應用程序是需要的,但是我沒有意識到過濾器實際上是在我的控制器之前捕獲重定向(日誌表明它發生在稍後的點)。一旦我將該過濾器設置爲在我的控制器中跳過,一切都很順利。

道德故事,我需要更好地考慮before_filter s在ApplicationController的副作用。

感謝RSB和Jasdeep Singh以及其他花時間考慮此問題的人。

0

試試這個,

sign_out current_user, :bypass => true 
+0

太好了,我會試試! – rdnewman

+0

我不知道'bypass'選項,謝謝。但它似乎只適用於'sign_in'。我嘗試了它並得到了'ArgumentError(參數的錯誤數目爲2)' – rdnewman

+0

你能告訴我你使用的是什麼版本嗎 – RSB

相關問題