2014-04-22 56 views
0

在我的應用程序中,我試圖強制用戶登錄以執行某些操作。當他們嘗試在未簽名時執行這些操作時,他們將被重定向到「登錄」頁面,並且一旦他們登錄,他們就會重定向到他們嘗試訪問的頁面。我用下面的代碼正確地工作。Rails - 正確重定向到上一頁

控制器代碼

if !(signed_in?) 
    session[:return_to] = newcompany_path 
    redirect_to signin_path 
    flash[:notice] = "You must be signed in to add companies." 
else 
     @company = Company.new 
    @primary_field = @@fields 
end 

... 

redirect_path = session[:return_to] 
if user && user.authenticate(params[:session][:password]) 
    sign_in user 
    session[:return_to] = nil 
    if (redirect_path == nil) 
     redirect_to user 
    else 
     redirect_to redirect_path 
    end 
else 

我運行到的是,如果用戶點擊從登錄頁面遠沒有實際登錄的session[return_to]變量未正確清除的問題,如果他們然後返回登錄,他們被重定向到錯誤的頁面。

那麼,我如何設置它,所以如果用戶點擊遠離登錄頁面,會話[:redirect_to]變量被重置?

回答

2

您可以在查詢字符串參數而不是會話中傳遞return_to路徑,並將其與登錄表單一起提交,以便它僅適用於該表單,而不是後續請求。

當重定向到形式上的標誌,它會看起來像:

redirect_to signin_path(return_to: newcompany_path) 

然後,在你登錄表單,確保包括一個隱藏字段與return_to值,如:

hidden_field_tag :return_to, params[:return_to] 

然後在您的控制器登錄操作中,您將檢查params[:return_to]而不是session[:return_to]以獲取所需的路徑。

+0

這很美!萬分感謝。完美的作品。我沒有使用查詢字符串參數之前,你有任何機會知道任何地方獲得更多的知識這個東西? – Scalahansolo

+0

他們沒有什麼特別的特別之處。你幾乎可以設置任何你想要的鍵/值(儘管你必須小心使用特殊字符,比如值和中的&),然後服務器可以根據請求使用它們。因此,如果您在Rails中訪問像/ foo?bar = 1&baz = rails這樣的URL,則會有名爲'bar'和'baz'的參數。當您在Rails中生成路徑時,Rails無法識別的任何密鑰(id,anchor等)都會變成查詢字符串。所以'signin_path(return_to:newcompany_path)'會爲你提供一個URL/signin?return_to =/companies/new –

0

這是你在找什麼?

redirect_to request.referrer