2016-10-05 5 views
1

Angesichts einer RESTful-API, die in Rails implementiert ist, möchte ich in die Antworten nicht nur die Fehlermeldungen aufnehmen, die von ActiveModel::Validations generiert werden, sondern auch benutzerdefinierte Fehlercodes. Zunächst möchte ich darauf hinweisen, dass ich nicht über HTTP Status codes spreche. Ich spreche über einen Fehler von einem beliebigen Typ (von allgemeinen Fehlern wie record not found bis kleine Validierungsfehler wie username can't be blank), die auf einen eindeutigen numerischen Code abgebildet werden, dh benutzerdefinierte anwendungsspezifische Fehlercodes. Lassen Sie mich ein Beispiel geben - gegeben eine Liste der Fehlercodes, wie zB:Wie können benutzerdefinierte Fehlercodes in einer Rails-API zurückgegeben werden?

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 

Wenn ich ein Formular für einen Benutzer und legt ihn mit leeren Felder für Vor- und Nachnamen, ich aus der Antwort haben wollen so etwas wie:

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

oder etwas ähnliches (zum Beispiel könnte ich eine Reihe von error objects habe, die jeweils mit einem Code, Nachricht für Entwickler, Nachricht für Benutzer etc.). Lassen Sie mich ein Beispiel mit dem Twilio API geben, genommen von RESTful API Design: what about errors?:

enter image description here

Hier 20003 einig benutzerdefinierten Twilio spezifischer Code. Die Frage ist - wie kann dies in Rails implementiert werden? Ich sehe mehrere schwierige Aspekte:

  • Wie bekomme ich eine Liste aller möglichen Fehler, die auftreten können. Es ist schwer, eine solche Liste nur für die Validierungsfehler zu bekommen, geschweige denn die anderen Arten von Fehlern, die auftreten können.
  • Wie sollte diese Liste organisiert werden - vielleicht in einer YAML-Datei?
  • Wie greife ich auf die Liste zu - vielleicht so ähnlich wie über I18n.t?

Ich werde wirklich jeden Rat zu diesem Thema schätzen. Vielen Dank.

P.S. Ich denke, das ist ein similar question.

Antwort

1

ActiveModel eingebaute Validatoren können here gefunden werden. Manchmal kann ein Validierer nach mehr als einer Sache suchen und verschiedene Nachrichten ausgeben. Der einfachste Weg, sie alle zu sehen, ist, wie Sie erraten haben, in seiner I18n Yaml-Datei, die here gefunden werden kann.

Eine Möglichkeit zu tun, was Sie wollen, überschreibt diese Nachrichten mit Ihren benutzerdefinierten Codes. Eine andere Möglichkeit besteht darin, eine benutzerdefinierte Nachricht zu übergeben, wenn Sie Ihren Modellen explizit einen Validator zuweisen.

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

Diese zwei Optionen werden Ihnen mit der Struktur jedoch nicht helfen. Sie werden keinen anderen Schlüssel code auf Ihrem Json out of the box haben.

Eine Möglichkeit, die Sie erreichen können, besteht darin, einen Helper zu erstellen, der die Fehlermeldungen analysiert und die Codes extrahiert, nachdem sie einer Modellinstanz zugewiesen wurden. Etwas entlang der Linien von:

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

, dass Sie eine Reihe von Fehlercodes für diese Instanz geben würde, wenn Sie das Format code:001 - my custom message benutzt hatte.

Ein anderer, viel komplizierterer Weg besteht darin, die Validator-Klasse von ActiveModel anzuzapfen und einen Fehlercode zu speichern, wenn eine Validierung fehlschlägt. Das würde erfordern, in jeden Validierer zu gehen, um den Code zuzuweisen.

Verwandte Themen