葡萄错误处理策略?

时间:2014-10-23 12:59:40

标签: ruby-on-rails ruby rest grape grape-entity

我正在使用Grape和Rails创建REST API。我有基本的架构,我正在寻找干净的地方。事情。其中一个地方是错误处理/处理。

我目前正在整个API的root.rb(GRAPE :: API基类)文件中解决错误。我格式化它们然后通过rack_response发回错误。一切正常,但是root.rb文件变得有点臃肿,所有的错误都被拯救了,其中一些有特殊的解析需要完成。我想知道是否有人为错误处理制定了一个好的策略,以便可以将其移出到它自己的模块中并使root.rb(GRAPE :: API基类)相当精简。

我真的想创建一个错误处理模块并为每种类型的错误定义方法,例如......

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

然后在root.rb文件中执行类似这样的操作

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

有人做过这样的事吗?我一直在尝试各种风格的上述策略,但我似乎无法做任何事情。

1 个答案:

答案 0 :(得分:5)

我已经达成以下解决方案/战略......

我将所有错误救援移动到自己的模块,如下所示

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

然后我只是将错误包含在我的基础GRAPE :: 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

经过大量的实验和许多其他尝试不起作用后,我认为这是一个很好的解决方案,我的基础GRAPE :: API类仍然非常精简。我仍然对人们可能采取的任何其他方法持开放态度。