2014-10-23 22 views
8

Używam Grape i Rails do tworzenia REST API. Mam podstawową architekturę w miejscu i szukam miejsc, w których można "oczyścić" rzeczy. Jednym z tych miejsc jest obsługa/przetwarzanie błędów.Strategia obsługi błędów winogron?

Obecnie próbuję ratować błędy w pliku root.rb (GRAPE :: API base class) dla całego interfejsu API. Formatuję je, a następnie wysyłam błąd z powrotem przez rack_response. Wszystko działa, ale plik root.rb jest nieco nadęty, a wszystkie błędy są ratowane, a niektóre z nich wymagają specjalnej analizy. Zastanawiam się, czy ktoś opracował dobrą strategię obsługi błędów, aby można było przenieść ją do własnego modułu i pozostawić root.rb (GRAPE :: API base class) całkiem szczupłą.

Naprawdę chciałbym, aby utworzyć moduł przetwarzania błędów i definiować metody dla każdego typu błędu, na przykład ...

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 

Następnie w pliku root.rb zrobić coś takiego

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 

Czy ktoś zrobił coś takiego? Próbowałem różnych smaków powyższej strategii, ale wydaje mi się, że nic nie działa.

+0

Spójrz [tutaj] (https://github.com/intridea/grape/issues/177) wygląda na to, że było/jest prośbą o funkcję, ale wygląda na to, że ludzie znaleźli pracę na teraz. – engineersmnky

+0

Nie całkiem to samo, czego szukałem, ale z pewnością kilka pomysłów do przemyślenia w linku. Dzięki. – mfunaro

Odpowiedz

5

Doszedłem do następnego rozwiązania/strategii ...

przeniosłem wszystko do błędu ratowanie własnego modułu jak na poniższym

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 

Potem po prostu zawierać błędy w mojej bazy WINOGRONA :: klasa API

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 

Po wielu eksperymentach i wiele innych prób nie działa, myślę, że to jest w porządku rozwiązanie i moja klasa bazowa GRAPE :: API pozostaje dość chudy. Wciąż jestem bardzo otwarty na wszelkie inne podejścia, jakie mogą mieć ludzie.

+0

Czy renderujesz wszystkie swoje błędy za pomocą kodu 500? –

+0

Nie, mam "catch all" 500, ale uratowałem od innych błędów, ustawiając kod statusu na odpowiedni dla błędu. Na przykład ratujemy niestandardowe nieprzetworzalne błędy i ustawiamy ich kod statusu na 422. – mfunaro

Powiązane problemy