2013-12-10 21 views
6

は私の質問に多くの背景を与えるために、このGithubの問題を参照してください - 私はエラーロガーをあるravenを使用していますhttps://github.com/getsentry/raven-ruby/issues/144ミドルウェアでcurrent_userを設定するにはどうすればよいですか?

。私は、ユーザーがログインしている場合current_userのIDを追加したい。私が受け取った答えはこれはあなたのミドルウェアを介して、またはどこか似て行われるべきである

ました。

ここで、このは、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 

。 Railsのアプリのために

+1

これは興味深いようです。 Deviseがミドルウェアで使用できるcurrent_userメソッドを持っているのかどうか疑問に思っていました。 – rohitmishra

14

、私はちょうどApplicationController内部before_actionにレイヴン(歩哨)コンテキストを設定し成功を収めてきました:

# 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 

カラスラックミドルウェアは、すべてのリクエストの後にコンテキストをクリアしますので、これは動作します。 See here.例外が発生しない大部分のケースでもコンテキストを設定しているので、最も効率的ではありません。しかし、どんな場合でも、それは操作の高価ではないし、それはあなたが本当に新しいラックミドルウェアまたは何かを注入することを混乱させる必要があるかどうかではかなり遠くなるでしょう。

+0

これは良い方法のようです。私は現在Ravenを使っていないので、これを試すことはできませんが、これは私が探していたソリューションの一種です。 Ravenでこれを試す機会が得られたら、あなたの解決策を正しいものとしてマークします。 – rohitmishra

関連する問題