我的应用程序控制器中有一个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。
答案 0 :(得分:27)
:except
选项采用操作名称,而不是网址部分。这是你应该做的事情:
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
您不希望将:except
放入ApplicationController
,因为如果您这样做,则每个应用的控制器的new
和destroy
操作都不会' t更新活动时间。