首页 > 解决方案 > 发送后访问响应状态

问题描述

我正在开发一种功能来存储对我的应用程序中特定端点发出的请求。

after_action :record_user_activity
def record_user_activity
  return unless current_user
  return if request.url =~ /assets|packs/
  @session.navigation.create!(
    uri: request.url,
    request_method: request.method,
    response_status: response.code.to_i,
    access_time: Time.now
  )
end

问题是,即使我们得到一个错误响应,当得到response.code此时的 ( after_action) 时,响应码仍然是 2xx。我想这可能是因为服务器还没有遇到在数据访问过程中可能遇到的任何问题。

如何正确存储实际发送给用户的状态代码?

标签: ruby-on-railsrubyhttp

解决方案


rails 日志已经存储了请求和响应。如果您只需要跟踪所有用户请求,您可以简单地将用户 ID 添加到您的日志中。除非有特定原因将这些数据保存在数据库中,否则数据库会随着用户活动的数量呈指数增长,否则将其添加到config/application.rbconfig/environments/production.rb

MyAppName::Application.configure do
  #...whatever you already have in configs
  # then add the following line
  config.log_tags = [
          -> request { "user-#{request.cookie_jar.signed[:user_id]}" }
      ]
end

然后,您可以跟踪日志并使用 grep,或者编写一些其他进程来使用其他分析来解析日志。有许多工具可用于此类工作。但这是一个基本的例子

tail -f logs/production.log | grep user-101 
# this would show all log requests from user with id 101

但是,如果您仍然需要这个,您可能想尝试一下prepend_after_action,请参阅

http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-prepend_after_action


推荐阅读