我有一個控制器和它的每一個方法開始用下面的代碼:代碼中的每個控制器方法
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
return
end
我只是想知道是否有可能避免在這種情況下,代碼重複?
我有一個控制器和它的每一個方法開始用下面的代碼:代碼中的每個控制器方法
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
return
end
我只是想知道是否有可能避免在這種情況下,代碼重複?
是,使用before_filter
class YourController < ApplicationController
before_filter :check_user
def check_user
..
end
end
嘗試使用before filter。這應該沒問題
絕對。
class MyController < ApplicationController
before_filter :ensure_logged_in
# actions here.
def ensure_logged_in
@user = UserData.find_by_login(session[:cuser])
if @user == nil
redirect_to(:controller=> 'user_data', :action=> 'login')
end
end
end
你不應該需要擔心的「迴歸」,鐵軌會擺脫困境的過濾器管道一旦發生重定向的。
爲避免重複,您只需在每個要檢查用戶身份驗證的控制器中添加before_filter。
class SomeController < ApplicationController
before_filter :authenticate_user
end
然後添加你的用戶認證邏輯應用控制器這樣的事情,
class ApplicationController < ActionController::Base
private
def current_user
@current_user ||= UserData.find_by_login(session[:cuser]) if session[:cuser]
end
helper_method :current_user
def authenticate_user
redirect_to({:controller=> 'user_data', :action=> 'login'}, :alert => "Not authorized") if current_user.nil?
end
end
您可以使用每個控制器CURRENT_USER helper方法獲取當前用戶。