2012-11-14 50 views
2

我有一個控制器和它的每一個方法開始用下面的代碼:代碼中的每個控制器方法

@user = UserData.find_by_login(session[:cuser]) 

if @user == nil 
    redirect_to(:controller=> 'user_data', :action=> 'login') 
    return 
end 

我只是想知道是否有可能避免在這種情況下,代碼重複?

回答

2

是,使用before_filter

class YourController < ApplicationController 

    before_filter :check_user 

    def check_user 
    .. 
    end 

end 
2

絕對。

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 

你不應該需要擔心的「迴歸」,鐵軌會擺脫困境的過濾器管道一旦發生重定向的。

1

爲避免重複,您只需在每個要檢查用戶身份驗證的控制器中添加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方法獲取當前用戶。

相關問題