ruby-on-rails - restful - rake routes
: excepto que no funciona en before_filter en el controlador de la aplicaciĆ³n. Problema de enrutamiento? (1)
Tengo un before_filter en mi controlador de aplicación para mantener viva la sesión de un usuario (y cerrarla si se ha agotado el tiempo de espera). Esto debe invocarse en cada acción, excepto / sessions / new y / sessions / destroy, que se enrutan como / login y / logout.
Las partes relevantes de mi controlador de aplicación se ven así;
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
y my routes.rb contiene lo siguiente;
map.login "login", :controller => "sessions", :action => "new"
map.logout "logout", :controller => "sessions", :action => "destroy"
Se está llamando al before_filter cuando se visitan / login o / logout. Esto no es un show-stopper, pero causa algunos comportamientos extraños (por ejemplo, al cerrar la sesión desde una página que ha expirado).
¿Alguna idea de lo que estoy haciendo mal? Estoy usando Rails 2.3.10.
La opción :except
toma nombres de acción, no partes de url. Esto es lo que debe hacer en su lugar:
class ApplicationController < ActionController::Base
before_filter :update_activity_time
...
end
Luego, en sessions_controller.rb
:
class SessionsController < ApplicationController
skip_before_filter :update_activity_time, :only => [:new, :destroy]
...
end
No desea colocar el :except
en ApplicationController
porque, si lo hiciera, las acciones new
y de destroy
para cada uno de los controladores de su aplicación no actualizarían el tiempo de actividad.