要为我的问题提供更多背景信息,请参阅此 Github 问题 - https://github.com/getsentry/raven-ruby/issues/144
我正在使用raven
哪个是错误记录器。我想为current_user
如果用户已登录添加 id。我收到的答案是
这应该通过您的中间件或类似的地方来完成。
这意味着在 Raven中设置 current_user。
我已经阅读了有关中间件的信息,但仍然无法弄清楚如何才能融入current_user
其中。
要为我的问题提供更多背景信息,请参阅此 Github 问题 - https://github.com/getsentry/raven-ruby/issues/144
我正在使用raven
哪个是错误记录器。我想为current_user
如果用户已登录添加 id。我收到的答案是
这应该通过您的中间件或类似的地方来完成。
这意味着在 Raven中设置 current_user。
我已经阅读了有关中间件的信息,但仍然无法弄清楚如何才能融入current_user
其中。
对于 Rails 应用程序,我仅在before_action
内部设置 Raven (Sentry) 上下文就取得了成功ApplicationController
:
# application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_raven_context
def set_raven_context
# I use subdomains in my app, but you could leave this next line out if it's not relevant
context = { account: request.subdomain }
context.merge!({ user_id: current_user.id, email: current_user.email }) unless current_user.blank?
Raven.user_context(context)
end
end
这是因为 raven Rack 中间件在每次请求后都会清除上下文。看这里。但是,它可能不是最有效的,因为即使在大多数不会导致异常的情况下,您也在设置上下文。但无论如何,这并不是一项昂贵的操作,而且它会让你走得很远,而无需真正需要注入新的 Rack 中间件或任何东西。
我不太了解Raven
,但下面是一种方法,使用它,我们可以在整个应用程序中访问请求中的当前用户。
我们创建了一个类,它充当缓存,并从当前线程插入/检索数据
class CustomCache
def self.namespace
"my_application"
end
def self.get(res)
Thread.current[self.namespace] ||= {}
val = Thread.current[self.namespace][res]
if val.nil? and block_given?
val = yield
self.set(res, val) unless val.nil?
end
return val
end
def self.set(key, value)
Thread.current[self.namespace][key] = value
end
def self.reset
Thread.current[self.namespace] = {}
end
end
然后,当收到请求时,会检查当前会话,然后将用户的模型插入缓存中,如下所示
def current_user
if defined?(@current_user)
return @current_user
end
@current_user = current_user_session && current_user_session.record
CustomCache.set(:current_user, @current_user)
return @current_user
end
现在,您可以使用以下代码从应用程序中的任何位置检索当前用户,
CustomCache.get(:current_user)
我们还确保在服务请求之前和之后重置缓存,所以我们这样做,
CustomCache.reset
希望这可以帮助。