[英]:except not working in before_filter in application controller. Routing problem?
我的應用程序控制器中有一個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。
: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
您不希望在ApplicationController
放置:except
,因為如果您這樣做,每個應用程序控制器的new
和destroy
操作都不會更新活動時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.