在使用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 session
和redirect_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
的輸出顯示了重定向,並沒有提示它首先嚐試通過另一個控制器,某些事情正在觸發佈局。有沒有在重定向中強制佈局?
一個普通的'sign_out current_user'應該可以正常工作,你認爲可能有任何緩存正在進行,這給你一個錯覺,即用戶沒有正確登出? –
我試着清理我的瀏覽器的本地緩存來檢查,似乎有同樣的問題,但這當然是一個合理的事情仍然考慮。它確實感覺像是一個緩存問題... – rdnewman
除了清除本地緩存,還可以嘗試清除rails緩存,以防在應用程序中使用緩存'Rails.cache.clear' –