: кроме не работает в before_filter в контроллере приложения.Проблема маршрутизации? - PullRequest
12 голосов
/ 22 февраля 2011

В моем контроллере приложения есть before_filter, чтобы поддерживать сеанс пользователя живым (и выходить из него, если истекло время ожидания). Это должно вызываться при каждом действии, кроме / session / new и / session / 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

и мой rout.rb содержит следующее;

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

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

before_filter вызывается при посещении / login или / logout. Это не ограничитель показа, но он вызывает несколько странных действий (например, при выходе из страницы, для которой истекло время ожидания).

Есть идеи, что я делаю не так? Я использую Rails 2.3.10.

1 Ответ

27 голосов
/ 22 февраля 2011

Опция :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 в ApplicationController, потому что, есливы сделали, действия new и destroy для каждого из контроллеров вашего приложения не обновят время активности.

...