8

我正在使用 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

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

4

1 回答 1

6

我已经得出以下解决方案/策略......

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

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 类仍然非常精简。我仍然对人们可能采用的任何其他方法持开放态度。

于 2014-10-23T16:52:04.060 回答