我正在用Rails开发一个REST web服务。
在每个请求之后,我想将响应HTTP状态代码存储在数据库中,即使存在一些异常。我怎么能这么做?
我做了这两次尝试,但都没有成功:
发布于 2019-01-04 17:35:39
最后,我解决了添加一个中间件(这里,一些关于rails中间件如何工作的数据)的问题。详细地说,在config/application.rb中,我添加了:
config.middleware.insert_before "Rails::Rack::Logger","StoreStatus"
api控制器是
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文件:
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
请注意,可能有一些语法错误,因为这段代码是获得的,重构的代码包含了这个问题的其他无用的复杂性。
发布于 2016-06-15 22:15:50
您需要用一个begin救援块包装控制器的每个动作。类似于:
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
通常,这样的行为是由日志决定的,但是我假设您确实有一个很好的理由这样做。
如果您真的希望它像您前面提到的那样是干燥的,您可以将其放入应用程序控制器中:
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
注意:在应用程序控制器中,通常认为毯子救援是不好的做法。我认为真正处理这个问题的最好方法是实施一个全面的日志记录方案。
https://stackoverflow.com/questions/37839995
复制相似问题