簡體   English   中英

:除了不在應用程序控制器中的before_filter中工作。 路由問題?

[英]:except not working in before_filter in application controller. Routing problem?

我的應用程序控制器中有一個before_filter來保持用戶的會話處於活動狀態(如果已經超時,則將其注銷)。 這應該在除/ sessions / new和/ sessions / destroy之外的每個動作上調用,這些動作被路由為/ login和/ logout。

我的應用程序控制器的相關部分看起來像這樣;

class ApplicationController < ActionController::Base
  before_filter :update_activity_time, :except => [:login, :logout]

  private

  def update_activity_time
    if current_user
      time_out = current_user.setting.remember_me ? 20160 : current_user.setting.user_timeout
      from_now = time_out.minutes.from_now
    end
    if session[:expires_at].blank?
      session[:expires_at] = from_now
    else
      time_left = (session[:expires_at].utc - Time.now.utc).to_i
      if time_left <= 0
        session_expiry
      else
        session[:expires_at] = from_now
      end
    end
  end

  def session_expiry
    reset_session
    flash[:notice] = 'Your session has expired. Please log back in.'
    unless request.xhr?
      session[:return_to] = request.request_uri
      redirect_to login_url
    else
      session[:return_to] = request.referer
      render :js => "window.location.replace(\"#{login_url}\")"
    end
  end

end

和我的routes.rb包含以下內容;

map.login "login", :controller => "sessions", :action => "new"

map.logout "logout", :controller => "sessions", :action => "destroy"

在訪問/ login或/ logout時調用before_filter。 這不是一個顯示停止,但它確實會導致一些奇怪的行為(例如,當從已超時的頁面退出時)。

我有什么想法我做錯了嗎? 我正在使用Rails 2.3.10。

:except選項采用動作名稱,而不是url部分。 這是你應該做的事情:

class ApplicationController < ActionController::Base
  before_filter :update_activity_time
  ...
end

然后,在sessions_controller.rb

class SessionsController < ApplicationController
  skip_before_filter :update_activity_time, :only => [:new, :destroy]
  ...
end

您不希望在ApplicationController放置:except ,因為如果您這樣做,每個應用程序控制器的newdestroy操作都不會更新活動時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM