: кроме работы в before_filter в контроллере приложения. Проблема маршрутизации?
У меня есть pre_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
а my routes.rb содержит следующее:
map.login "login", :controller => "sessions", :action => "new"
map.logout "logout", :controller => "sessions", :action => "destroy"
При запуске /login или/logout вызывается before_filter. Это не шоу-стоппер, но это вызывает несколько нечетных действий (например, при выходе из выпадающей страницы).
Любые идеи, что я делаю неправильно? Я использую Rails 2.3.10.
Ответы
Ответ 1
Параметр :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
для каждого из ваших контроллеров приложений не будут обновлять время активности.