2016-10-05 1 views
1

레일스에서 ​​구현 된 RESTful API를 사용하면 ActiveModel::Validations에 의해 생성 된 오류 메시지뿐만 아니라 사용자 정의 오류 코드도 응답에 포함하고자합니다. 우선 나는 HTTP Status codes에 대해 이야기하고 있지 않다는 것을 지적하고자합니다. 나는 record not found과 같은 일반적인 오류에서부터 username can't be blank과 같은 작은 유효성 검사 오류에 이르기까지 모든 종류의 오류가 사용자 지정 응용 프로그램 관련 오류 코드 인 고유 한 숫자 코드에 매핑되는 것에 대해 이야기하고 있습니다. 저를 예를 들어 보겠습니다 - 같은 오류 코드의 목록 주어진 : 나는 사용자에 대한 양식을 가지고 첫 번째와 마지막 이름의 빈 필드로 제출하면Rails API에서 사용자 정의 오류 코드를 반환하는 방법은 무엇입니까?

1: record not found 
... some other errors 
# Validation errors for User model between 1000 to 2000 
1001: first name can't be blank 
1002: first name must contain at least 3 characters 
1003: last name can't be blank 
1004: last name must contain at least 3 characters 
...some other errors 

, 내가 응답 본문에 갖고 싶어 같은 뭔가 :

{error_codes: [1001, 1002, 1003, 1004]} 

또는 이와 유사한 (예를 들어 나는 사용자 등 코드, 개발자를위한 메시지, 메시지 error objects, 각각의 배열을 가질 수있다). 나를 RESTful API Design: what about errors?에서 촬영 Twilio의 API로 예를 들어 보겠습니다 : 여기

enter image description here

, 20003은 일부 사용자 지정 Twilio 특정 코드입니다. 문제는 - 이것이 레일스에서 ​​어떻게 구현 될 수 있는가하는 것입니다. 몇 가지 어려운 점이 있습니다.

  • 발생할 수있는 모든 오류 목록을 어떻게 얻을 수 있습니까? 발생할 수있는 다른 유형의 오류는 말할 것도없고 유효성 검사 오류에 대해서만 그런 목록을 얻는 것은 어렵습니다.
  • 이 목록을 어떻게 구성해야합니까 - 아마 YAML 파일에 있습니까?
  • 목록에 액세스하려면 어떻게해야합니까? I18n.t을 통해 번역 방법에 액세스하는 것과 비슷한 방법일까요?

정말 이에 대한 조언을드립니다. 고맙습니다.

P. 나는 이것이 similar question이라고 생각합니다.

답변

1

ActiveModel 내장 검사기는 here입니다. 때로는 하나의 유효성 검사기가 두 가지 이상을 검사하고 다른 메시지를 출력 할 수 있습니다. 그들 모두를 보는 가장 쉬운 방법은, 당신이 짐작했던대로, here이라는 I18n yaml 파일입니다.

원하는 작업을 수행하는 한 가지 방법은 해당 메시지를 사용자 지정 코드로 덮어 쓰는 것입니다. 또 다른 방법은 모델에 유효성 검사기를 명시 적으로 부착 할 때 사용자 지정 메시지를 전달하는 것입니다.

validates :name, message: 'code:001 - my custom message' 

두 가지 옵션은 구조에 도움이되지 않습니다. 제품 상자에 다른 키 code을 가지고 있지 않습니다.

오류 메시지를 구문 분석하고 모델 인스턴스에 코드를 할당 한 후 코드를 추출하는 도우미를 만들 수 있습니다. 의 라인을 따라 뭔가 :

def extract_error_codes(error_messages) 
    error_messages.map{ |message| message.match('^code:(\d+)\s-')[1] } 
end 

당신이 형식 code:001 - my custom message을 사용 더라면 그 예를 들어 당신이 오류 코드의 배열을 줄 것이다.

또 다른 방법은 유효성 검사가 실패 할 때 ActiveModel의 Validator 클래스를 활용하고 오류 코드를 저장하는 것입니다. 코드를 할당하려면 각 유효성 검사기에 들어가야합니다.