2014-10-23 18 views
8

Sto utilizzando Grape e Rails per creare un'API REST. Ho l'architettura di base in atto e sto cercando posti per "ripulire" le cose. Uno di questi posti è la gestione/elaborazione degli errori.Strategia di gestione dell'errore dell'uva?

Attualmente sto salvando gli errori nel file root.rb (GRAPE :: API base class) per l'intera API. Li formatto e poi rispedisco l'errore tramite rack_response. Tutto funziona, ma il file root.rb si sta gonfiando di tutti gli errori che vengono salvati e alcuni di essi hanno un'analisi speciale che deve essere eseguita. Mi stavo chiedendo se qualcuno ha sviluppato una buona strategia per la gestione degli errori in modo che possa essere spostato nel proprio modulo e lasciare la root.rb (classe base API GRAPE ::) abbastanza snella.

mi piacerebbe davvero per creare un modulo di elaborazione di errore e definire i metodi per ogni tipo di errore, per esempio ...

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 

Poi nel file root.rb fare qualcosa di simile

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 

Qualcuno ha fatto qualcosa del genere? Ho provato vari sapori della strategia di cui sopra, ma non riesco a far funzionare nulla.

+0

Dai uno sguardo [qui] (https://github.com/intridea/grape/issues/177) sembra che fosse/è una richiesta di funzionalità ma sembra anche che le persone abbiano trovato un lavoro da fare per ora. – engineersmnky

+0

Non proprio la stessa cosa che stavo cercando, ma sicuramente alcune idee a cui pensare nel collegamento. Grazie. – mfunaro

risposta

5

Sono venuto per la seguente soluzione/strategia ...

ho spostato tutti gli errori salvataggio di un proprio modulo simile al seguente

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 

Poi ho semplicemente includo gli errori nel mio UVA di base :: classe 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 

Dopo un sacco di sperimentazione e un sacco di altri tentativi non funziona, penso che questo sia un bel soluzione e la mia classe di base UVA :: API rimane abbastanza magra. Sono ancora molto aperto a qualsiasi altro approccio che le persone potrebbero avere.

+0

Così rendi tutti i tuoi errori con il codice 500? –

+0

No, ho un 'catch all' 500, ma recupero da altri errori impostando il codice di stato su ciò che è appropriato per l'errore. Ad esempio salviamo errori non elaborati personalizzati e impostiamo il loro codice di stato su 422. – mfunaro