Ruby on rails 葡萄错误处理策略?

Ruby on rails 葡萄错误处理策略?,ruby-on-rails,ruby,rest,grape,grape-entity,Ruby On Rails,Ruby,Rest,Grape,Grape Entity,我正在使用Grape和Rails创建RESTAPI。我有基本的架构,我正在寻找地方“清理”东西。其中一个地方是错误处理/处理 我目前正在为整个API挽救root.rb(GRAPE::API基类)文件中的错误。我格式化它们,然后通过rack_响应将错误发送回。所有的东西都可以找到,但是root.rb文件变得有点臃肿,所有的错误都被解救了,其中一些错误需要进行特殊的解析。我想知道是否有人已经开发了一个很好的错误处理策略,这样就可以将它移入自己的模块中,并使root.rb(GRAPE::API基类)相

我正在使用Grape和Rails创建RESTAPI。我有基本的架构,我正在寻找地方“清理”东西。其中一个地方是错误处理/处理

我目前正在为整个API挽救root.rb(GRAPE::API基类)文件中的错误。我格式化它们,然后通过rack_响应将错误发送回。所有的东西都可以找到,但是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
模块API
类根

有人做过这样的事吗?我一直在尝试上述各种策略,但我似乎什么都没用

我想到了以下解决方案/策略

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

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
模块API
类根

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

看一看,这似乎是一个功能要求,但似乎人们现在已经找到了解决办法。这与我所寻找的不太一样,但肯定有一些想法可以在链接中考虑。谢谢。不,我确实有一个“全面覆盖”500,但我可以避免其他错误,将状态代码设置为适合该错误的值。例如,我们解救自定义的不可处理错误,并将其状态代码设置为422。