首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rails中存储异常后的响应HTTP状态代码

在Rails中存储异常后的响应HTTP状态代码
EN

Stack Overflow用户
提问于 2016-06-15 15:41:34
回答 2查看 2.3K关注 0票数 2

我正在用Rails开发一个REST web服务。

在每个请求之后,我想将响应HTTP状态代码存储在数据库中,即使存在一些异常。我怎么能这么做?

我做了这两次尝试,但都没有成功:

  • 应用控制器中的after_filter 类Api::ApiController < ActionController::Base before_action :set_current_rest_request after_filter :finalize_current_rest_request私有def set_current_rest_request @current_rest_request = RestRequest.new @current_rest_request.request_at = DateTime.now @current_rest_request.save end def finalize_current_rest_request @current_rest_request.answer_at= DateTime.now @current_rest_request.http_status_code = response.status @current_rest_request.save end 不起作用,因为在出现异常时不调用finalize_current_rest_request
  • 应用控制器中的rescue_from 类Api::ApiController < ActionController::Base before_action :set_current_rest_request after_filter :finalize_current_rest_request rescue_from异常,:with => :handle_exception私有def set_current_rest_request @current_rest_request = RestRequest.new @current_rest_request.request_at = DateTime.now @current_rest_request.save end def finalize_current_rest_request @current_rest_request.answer_at = DateTime.now @current_rest_request.http_status_code = response.status@current_rest_request.save端def handle_exception(异常) finalize_current_rest_request引发异常端 不起作用,因为在引发异常之前,当我在response.status中调用finalize_current_rest_request时,handle_exception仍然是200岁
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 17:35:39

最后,我解决了添加一个中间件(这里,一些关于rails中间件如何工作的数据)的问题。详细地说,在config/application.rb中,我添加了:

代码语言:javascript
运行
复制
config.middleware.insert_before "Rails::Rack::Logger","StoreStatus"

api控制器是

代码语言:javascript
运行
复制
class Api::ApiController < ActionController::Base
    before_action :set_current_rest_request
    private
    def set_current_rest_request
      @current_rest_request = RestRequest.new
      request.env[:current_rest_request] = @current_rest_request
    end
end

并使用以下代码添加了lib/store_status.rb文件:

代码语言:javascript
运行
复制
class StoreStatus
  def initialize(app)
    @app = app
  end

  def call(env)
    data = @app.call(env)
    if (env[:current_rest_request])
      rest_request = env[:current_rest_request]
      rest_request.http_status_code = data[0]
      rest_request.save
    end
    data
  end
end

请注意,可能有一些语法错误,因为这段代码是获得的,重构的代码包含了这个问题的其他无用的复杂性。

票数 0
EN

Stack Overflow用户

发布于 2016-06-15 22:15:50

您需要用一个begin救援块包装控制器的每个动作。类似于:

代码语言:javascript
运行
复制
begin
  respond_to do |format|
    format.json { redirect_to foos_path, notice: 'Foo was successfully destroyed.' }
rescue 
  @current_rest_request.http_status_code = response.status
  end
end

通常,这样的行为是由日志决定的,但是我假设您确实有一个很好的理由这样做。

如果您真的希望它像您前面提到的那样是干燥的,您可以将其放入应用程序控制器中:

代码语言:javascript
运行
复制
rescue_from Exception, :with => :store_request

def store_request
  current_rest_request = RestRequest.new
  current_rest_request.request_at = DateTime.now
  current_rest_request.http_status_code = response.status
  current_rest_request.save
end

注意:在应用程序控制器中,通常认为毯子救援是不好的做法。我认为真正处理这个问题的最好方法是实施一个全面的日志记录方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37839995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档