2014-11-21 70 views
2

在我的rails 3應用程序中,我使用的是devise 3.2.4和cancancan 1.9.2。我的問題是關於可超時設計模塊,它工作正常,但我無法拯救正確的異常,以便我可以向用戶顯示正確的通知。cancancan + devise:處理可超時異常

application_controller.rb包含:

rescue_from Exception do |exception| 
    unless Rails.env.production? 
    raise exception 
    else 
    redirect_to :back, :flash => { :error => exception.message } 
    end 
end 

# https://github.com/ryanb/cancan/wiki/exception-handling 
rescue_from CanCan::AccessDenied do |exception| 
    flash[:error] = exception.message 
    respond_to do |wants| 
    wants.html { redirect_to main_app.root_url } 
    wants.js { render :file => "shared/update_flash_messages" } 
    end 
end 

每當會話過期我可以拯救通用CanCan::AccessDenied異常與消息您無權訪問此頁但我想趕上可超時設計(我猜)例外,以便我可以顯示默認設計消息:您的會話已過期。請重新登錄以繼續

任何想法?

+0

我有完全相同的問題... – 2014-11-26 23:19:55

回答

0

當會話超時時,flash[:alert]的值設置爲:timeout,缺省情況下該值在config/locales/devise.en.yml中定義。

因此,不要從exception讀取消息,請嘗試從flash[:alert]讀取消息,並使您的應用程序做出相應的反應。例如,這是我在我的應用程序中使用的代碼:

rescue_from CanCan::AccessDenied do |exception| 
    if user_signed_in? 
    # Blank page with an error message 
    flash.now.alert = exception.message 
    render text: '', layout: true, status: 403 
    else 
    # Redirect to login screen and display the message 
    redirect_to new_user_session_path, :notice => flash[:alert] || "You must login first" 
    end 
end