2014-07-21 2 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 

그래서와 ApplicationController에 check_for_user를 이동하고 다음과 같이 수정했다 나의 접근 방식 :

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로는 만들 params가없는 다른 "더미"메소드를 호출하고 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