2014-07-21 86 views
0

在一個控制器中,我得到了一個方法,我想要重構與其他控制器共享。同時,我將它傳遞給回調before_action重構和回調

應用程序/模型/ meal_controller.rb

def check_for_user 
    token = request.headers[:token] 
    if token.nil? 
    render json: "Unathorized", status: 401 
    elsif @meal.user.auth_code != token 
    render json: "Forbidden", status: 403 
    end 
end 

所以我的做法是移動check_for_user到ApplicationController中,並按如下修改:

def check_for_user(item) 
    token = request.headers[:token] 
    if token.nil? 
     render json: "Unathorized", status: 401 
    elsif item.user.auth_code != token 
     render json: "Forbidden", status: 403 
    end 
    end 

而回MealController,創建其他不帶參數的「虛擬」方法並調用check_for_user。

def check_for_user_meal 
    check_for_user(@meal) 
end 

我的問題是:有沒有更好的方式來重構這段代碼?

在此先感謝。

回答

3

如果只有幾行代碼,那麼我的代碼在ApplicationController中沒有問題。

但是,我建議你檢查the difference between 401 and 403。主要區別在於401意味着您的身份驗證嘗試出現錯誤,請重試;而403意味着您嘗試以不正確的方式進行身份驗證,請停止嘗試。

使用用戶名/密碼用戶輸入,401是有意義的,因爲它可能是用戶錯誤的東西。

但是對於令牌,另一種嘗試只會得到相同的結果。所以沒有令牌和錯誤的令牌都會導致403錯誤。

所以我重構你這樣的代碼:

def request_token 
    request.headers[:token] 
end 

def check_for_user(item) 
    if request_token.nil? || item.user.auth_code != request_token 
    render json: "Forbidden", status: 403 
    end 
end 
0

您可以創建一個模塊,以便該方法在應用程序中可用。

+0

但我需要它只是在控制器,甚至在所有的人。 – tehAnswer

+0

該模塊是要走的路。如果沒有,你可以用它作爲幫手,並將其包含在你感興趣的控制器中。 – Leon