:除了不在应用程序控制器的 before_filter 中工作。路由问题?

2023-11-22

我的应用程序控制器中有一个 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。


The :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

你不想把:except in ApplicationController因为,如果你这样做了,new and destroy您的应用程序的每个控制器的操作都不会更新活动时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

:除了不在应用程序控制器的 before_filter 中工作。路由问题? 的相关文章

随机推荐