2014-10-23 24 views
8

Bir REST API'si oluşturmak için Grape ve Rails kullanıyorum. Temel mimariye sahibim ve işleri 'temizlemek' için yer arıyorum. Bu yerlerden biri hata işleme/işleme.Üzüm hatası yönetimi stratejisi?

Şu anda tüm API için root.rb (GRAPE :: API temel sınıf) dosyasındaki hataları kurtarıyorum. Onları biçimlendiriyorum ve daha sonra hatayı rack_response üzerinden geri gönderiyorum. Her şey işe yarıyor ama root.rb dosyası kurtarılan tüm hatalar ile biraz şişiriliyor ve bazılarının yapılması gereken özel ayrıştırma var. Herkesin kendi modülüne taşınabilmesi ve root.rb (GRAPE :: API temel sınıfı) 'nı oldukça yalın bırakması için hata işleme için iyi bir strateji geliştirip geliştirmediğini merak ediyordum.

Gerçekten örneğin, bir hata işleme modülü oluşturmak ve Her bir hata türü için yöntemler tanımlamak istiyorum

... root.rb dosyasında Sonra

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 

yapmak bu

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 
gibi bir şey

Böyle bir şey yapan oldu mu? Yukarıdaki stratejinin çeşitli tatlarını deniyorum ama işe yaramayacak bir şey göremiyorum.

+0

Bir göz atın [Here] (https://github.com/intridea/grape/issues/177), bir özellik isteğiydi, aynı zamanda insanlar şimdilik bir iş bulmuş gibi görünüyor. – engineersmnky

+0

Tam olarak aradığım şey değil ama kesinlikle bağlantıda düşünülmesi gereken bazı fikirler. Teşekkürler. – mfunaro

cevap

5

aşağıdaki çözüm/strateji geldiniz ...

Ben Sonra ben sadece benim taban ÜZÜM hataları şunlardır

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 

gibi kendi modülüne kurtarılmaya tüm hata taşındı :: deney bir sürü ve çalışmayan diğer girişimleri bir sürü sonra API sınıfı

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 

, bu iyi bir çözümdür ve benim taban ÜZÜM :: API sınıfı oldukça yalın kalır düşünüyorum. İnsanların sahip olabileceği diğer yaklaşımlara hala çok açıkım.

+0

Tüm hatalarınızı kod 500 ile mi yapıyorsunuz? –

+0

Hayır, 'hepsini yakala' 500'üm var, ancak durum kodunu, hata için uygun olana ayarlayan diğer hatalardan kurtardım. Örneğin, özel işlenemeyen hataları kurtarır ve durum kodunu 422 olarak belirleriz. – mfunaro