2013-12-10 64 views
6

爲了讓更多的背景,我的問題,請參見本Github的問題 - https://github.com/getsentry/raven-ruby/issues/144如何在中間件中設置current_user?

我使用raven這是一個錯誤記錄器。我想補充的ID爲current_user如果用戶登錄。我得到的答案

這應該通過您的中間件或類似的地方來完成。

其中這個表示在Raven中設置current_user。

我已閱讀過中間件,但仍然無法弄清楚如何將current_user合併爲一體。

回答

0

我對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 

希望這有助於。

+1

這似乎很有趣。我想知道Devise是否有一個我可以在中間件中使用的current_user方法。 – rohitmishra

14

對於Rails應用,我已經成功只需設置烏鴉(哨兵)上下文中before_actionApplicationController

# 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 

這工作,因爲烏鴉Rack中間件清除每一個請求後的上下文。 See here.但是,它可能不是最有效的,因爲即使在大多數不會導致異常的情況下,您仍要設置上下文。但無論如何,這並不是一項昂貴的操作,而且它會讓你非常茫然,無需爲注入新的Rack中間件或任何東西而煩惱。

+0

這似乎是一個很好的方法來做到這一點。我目前沒有使用Raven,因此無法嘗試,但這是我尋找的解決方案。一旦我有機會與Raven一起嘗試這個,請將您的解決方案標記爲正確。 – rohitmishra