2014-10-23 9 views
8

Ich benutze Grape und Rails, um eine REST API zu erstellen. Ich habe die grundlegende Architektur an Ort und Stelle und suche nach Orten, um Dinge zu "säubern". Einer dieser Orte ist die Fehlerbehandlung/-verarbeitung.Grape Fehlerbehandlung Strategie?

Ich rette derzeit Fehler in der Datei root.rb (GRAPE :: API-Basisklasse) für die gesamte API. Ich formatiere sie und sende den Fehler dann über rack_response zurück. Alles funktioniert, aber die root.rb-Datei wird ein wenig aufgebläht mit all den Fehlern, die gerettet werden, und einige von ihnen haben spezielle Parsing, die getan werden müssen. Ich habe mich gefragt, ob jemand eine gute Strategie für die Fehlerbehandlung entwickelt hat, damit er in sein eigenes Modul verschoben werden kann und die root.rb (GRAPE :: API-Basisklasse) ziemlich schlank bleibt.

Ich mag würde ein Fehlerverarbeitungsmodul erstellen und für jede Art von Fehlern Methoden definieren, zum Beispiel ...

module API 
module ErrorHandler 
    def record_not_found 
    rack_response API::Utils::ApiErrors.new({type: e.class.name, message: 'Record not found'}).to_json, 404 
    end 
end 
end 

Dann in der root.rb Datei tun so etwas wie dies

module API 
    class Root < Grape::API 
    prefix 'api' 
    format :json 

    helpers API::ErrorHandler 

    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found # Use the helper method as the handler for this error 
    end 
end 

Hat jemand so etwas getan? Ich habe verschiedene Aromen der oben genannten Strategie versucht, aber ich kann nicht scheinen, etwas Arbeit zu bekommen.

+0

Werfen Sie einen Blick [Hier] (https://github.com/intridea/grape/issues/177) scheint wie es war/ist eine Feature-Anfrage, aber scheint auch, wie Menschen haben eine Arbeit für jetzt gefunden. – engineersmnky

+0

Nicht ganz dasselbe, nach dem ich gesucht habe, aber definitiv einige Ideen, über die man im Link nachdenken sollte. Vielen Dank. – mfunaro

Antwort

5

Ich bin gekommen, um die folgende Lösung/Strategie ...

zog ich alle Fehler zu seinem eigenen Modul wie folgt

Rettung
module API 
    module Errors 
    extend ActiveSupport::Concern 

    included do 
     rescue_from :all do |e| 
     rack_response API::Utils::ApiErrors.new({type: e.class.name, message: e.message}).to_json, 500 
     end 
     . 
     . 
     . 
    end 
end 

Dann habe ich einfach die Fehler in meiner Basis GRAPE umfassen :: API-Klasse

module API 
    class Root < Grape::API 
    include API::Errors 

    prefix 'api' 
    format :json 

    helpers API::Utils::Helpers::IndexHelpers 
    helpers API::Utils::Helpers::WardenHelpers 
    helpers API::Utils::Helpers::RecordHelpers 
    . 
    . 
    . 
    end 
end 

Nach vielen Experimenten und vielen anderen Versuchen nicht funktioniert, ich denke, das ist eine feine Lösung und meine Basis GRAPE :: API-Klasse bleibt ziemlich mager. Ich bin immer noch sehr offen gegenüber anderen Ansätzen, die Menschen haben könnten.

+0

Also rendern Sie alle Ihre Fehler mit Code 500? –

+0

Nein, ich habe eine 'alle fangen' 500, aber ich rette von anderen Fehlern, indem ich den Statuscode auf den für den Fehler geeigneten Wert setze. Zum Beispiel retten wir benutzerdefinierte nicht verarbeitbare Fehler und setzen ihren Statuscode auf 422. – mfunaro