2011-03-03 59 views
2

我試圖使用session[:user.return_to]但沒有成功...如何使用會話[:user.return_to]從設計

我的代碼:

def after_sign_in_path_for(resource) 
    (session[:"user.return_to"].nil?) ? "/" : session[:"user.return_to"].to_s 
end 

那麼,問題是:當我檢查我的會話變量,我沒有任何與這些名稱。

我想在轉到登錄頁面之前訪問我正在處理的頁面。

+0

你爲什麼使用'session [:「user.return_to」]''的任何特殊原因? '會話[:return_to]'是在Devise文檔中記錄的。 – sorens

+0

[手動設置return_to與設計]的可能重複(http://stackoverflow.com/questions/5957714/manually-setting-return-to-with-devise) –

回答

3

與同樣的問題掙扎着。我有一個馬馬虎虎的解決方案,到目前爲止,像這樣..

在我application_controller.rb

before_filter :set_page # at the top and then 

    protected 
    def set_page 
    unless request.referer.include?('/users/sign') 
     session[:return_to] = request.referer 
    end 
    end 

的,除非聲明是爲了防止用戶被返回到登錄或登出頁面。我不喜歡這裏的網址是硬編碼的,所以我希望看到更好的解決方案。另外,似乎before_filter從不會在重定向到登錄頁面的頁面上發生,因此如果您點擊需要登錄的內容,登錄後您將被帶回到您點擊鏈接的頁面,而不是實際的鏈接本身。

0

您需要在重定向某人之前定義會話變量。

session[:url_back] = "/*** 
2

有幾種方法,你可以去這個問題。

隨着Devise的新版本(我在2.1.2上),將before_filter :authenticate_user!添加到您的控制器將自動爲您設置此行爲。

如果你仍然想手動設置它,一種方法是隻設置session中的路徑。 Devise希望在session["#{resource}_return_to"]中找到它,其中'resource'是用戶模型的名稱。所以通常是session["user_return_to"]。你有一段時間'。'在你的版本中,這可能會導致你的錯誤。另外,session接受鍵的字符串值,因此不需要嘗試對其進行符號化。

另一種方法是像你一樣覆蓋after_sign_in_path_for(resource)方法。有關如何在設計wiki How To: Redirect back to current page after sign in上執行此操作的更多詳細信息。

最後,由於這將發出重定向,您可能需要考慮使用完整的URL。

def after_sign_in_path_for(resource) 
    session["#{resource}_return_to"] || root_url 
end 
0

在ApplicationController.rb

def after_sign_in_path_for(resource) 
    sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http') 
    if request.referer == sign_in_url 
    super 
    else 
    stored_location_for(resource) || request.referer || root_path 
    end 
end 

stored_location_for(資源)是設計一種內置的方法存儲從用戶是從哪裏來的位置。