2013-08-29 2 views
4

REST API 만있는 Rails 애플리케이션을 작성하고 있습니다 (웹 인터페이스가 없음). 요청이 올바른 매개 변수로 작성되었는지 확인하고 그렇지 않은 경우 다른 오류 코드를 리턴해야합니다. 예를 들어 모든 API 엔드 포인트에는 user_access_token 및 client_id가 필요합니다. 일부 다른 엔드 포인트는 다른 다른 매개 변수가 필요합니다.REST API에서 Rails API 매개 변수 유효성 확인

모든 컨트롤러에는이 검사를 수행하는 코드가 있지만 코드가 중복되고 추출 할 수있는 다른 if-condition이 많이 있습니다. 그래서이 검사를 수행하는 ApplicationControllerbefore_filter을 추가 할 것을 고려했습니다. required_params 매핑에 대한 모든 끝점을 포함하는 해시를 정의했으며이 필터는 컨트롤이 문제의 실제 컨트롤러로 전달되기 전에 실행됩니다.

그러나 일부 끝점의 경우 다른 매개 변수가 있으면 매개 변수가 필요하고 두 매개 변수 중 하나가 필요하기 때문에 약간 복잡해지고 있습니다. 그래서 지금이 일을하는 더 좋은 방법이 있는지 궁금합니다.

내가 제대로하고 있습니까? 이 작업을 수행하는 더 나은/표준화 된 방법이 있습니까? 아니면이 일을하는 보석?

답변

5

문맥을 이해하려면 약간의 코드가 필요합니다. 그러나 그것은 당신이 다른 모든 컨트롤러가 상속받은 기본 ApplicationController를 가지고있는 것처럼 들립니다. 다양하게 변하는 것은 예상되는 매개 변수입니다 (항상 제공되어야하는 user_access_token과 client_id 제외). 상속을 사용하고 있기 때문에 ApplicationController에서 기대하는 매개 변수의 목록을 포함하는 메서드를 정의한 다음 하위 클래스의 메서드를 재정 의하여 다른 매개 변수를 추가하는 메서드를 재정의 할 수 있습니다. 기본 컨트롤러가 실제 유효성 검사를 수행하지만 하위 클래스는 필수 매개 변수를 무시할 수있는 기회를 갖습니다.

class ApplicationController < ActionController::Base 
    before_filter :validate_params 

    protected 

    def required_params 
    [:user_access_token, :client_id] 
    end 

    def validate_params 
    unless (require_params - params.keys).count.zero? 
     # do something 
    end 
    end 
end 

class AnotherController < ApplicationController 
    protected 

    def required_params 
    p = super + [:email, :password] 
    p = p + [:another, :and_another] if some_condition? 
    p 
    end 
end 

필수적으로 추가 매개 변수를 추가해야하는지 여부를 하위 클래스가 결정하도록합니다. 물론 나는 당신의 정확한 맥락이 무엇인지는 모르지만 바라 건데 이것이 올바른 방향으로 당신을 도울 것입니다. 당신이 기회를 얻을 때 다형성에 대한 연구를 해보십시오 :-)

+0

오 마이 갓! 이것은 Ruby-is-awesome 순간 중 또 하나입니다! 수년간의 Java 경험을 통해, 각 param에 대해'params [: name] .nil? '을 검사하고 있었고, 그것이 어려워졌습니다. 이 일이 나를 도와 줘야 해! 고마워. –

관련 문제