2011-08-08 24 views
18

我有一個ajax投票按鈕:如果用戶點擊「豎起大拇指」的圖像,但沒有登錄,那麼他們應該看到一個對話框,要求他們先登錄。成功DEVISE登錄後,如何將用戶重定向回以前需要登錄的操作?

要做到這一點對話框,我使用jQuery和facebox綁定到ajax:failure事件。如果用戶未登錄,Devise會引發401 Unauthorized。facebox會在顯示DEVISE登錄表單的彈出對話框中加載登錄的遠程html。

除了成功登錄後,所有工作都會正常工作,用戶將被重定向到主頁。如果用戶被重定向到他們正在查看的帖子,以便他們可以繼續投票,那將會更直觀。

是否有實現此行爲的最佳實踐方法?

謝謝。

+1

這裏接受如何? – coreyward

回答

-1

使用cookie。獲取他們試圖訪問的window.location.href並將其作爲cookie存儲。在您的主頁上,檢查此cookier文檔準備功能的存在,重定向如果有

+0

這與Rails重定向有關。使用Javascript重定向是錯誤的。 – Byron

19

我做的Rails 3 Authlogic以下,也許你可以使用它,或者做類似的事情:

class ApplicationController < ActionController::Base 
    after_filter :store_location 
private 
    def store_location 
    session[:return_to] = request.fullpath 
    end 

    def clear_stored_location 
    session[:return_to] = nil 
    end 

    def redirect_back_or_to(alternate) 
    redirect_to(session[:return_to] || alternate) 
    clear_stored_location 
    end 
end 

然後,您可以在登錄操作中使用類似redirect_back_or_to dashboard_path的東西。

對於某些控制器/操作,我不想存儲位置(例如登錄頁面)。對於那些我只跳過過濾器:

class UserController < ApplicationController 
    skip_after_filter :store_location 
end 

還有一個頁面在設計維基就這樣做:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in

+1

這個Devise wiki [https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up, -update](https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-更新)有一個更好的,更防彈的解決方案,檢查它之前,你會使用此代碼;) –

+1

@ViktorBenei我不會說這是客觀上更好或「更防彈」,但它是風格不同,儘管經營非常與此類似。 – coreyward

4

在ApplicationController中寫入以下內容:

after_filter :store_location 
def store_location 
    session[:previous_urls] ||= [] 
    # store unique urls only 
    session[:previous_urls].prepend request.fullpath if session[:previous_urls].first != request.fullpath 
    # For Rails < 3.2 
    # session[:previous_urls].unshift request.fullpath if session[:previous_urls].first != request.fullpath 
    session[:previous_urls].pop if session[:previous_urls].count > 2 
end 
def after_sign_in_path_for(resource) 
    session[:previous_urls].last || root_path 
end 

來源: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

+3

注意:鏈接的Devise wiki具有更好的防彈解決方案,請在使用此代碼之前對其進行檢查。 –

+0

以前/ sign_out時錯誤的方式。此路徑將存儲到previous_urls – SAHbKA

+0

我將'after_filter'更改爲'before_action',因爲我的身份驗證過濾器將重定向非授權請求,因此不會調用:store_location。 – Cheng

相關問題