2013-12-10 7 views
6

Чтобы дать больше фона на мой вопрос, пожалуйста, обратитесь к этому вопросу Github - https://github.com/getsentry/raven-ruby/issues/144Как установить current_user в промежуточное программное обеспечение?

Я использую raven который является регистратор ошибок. Я хочу, чтобы добавить идентификатор для current_user, если пользователь вошел в систему. Ответ, который я получил, был

Это должно быть сделано с помощью вашего промежуточного слоя или где-то похожи.

Этот означает установку current_user в Raven.

Я читал о посредниках, но до сих пор не смог выяснить, как я могу получить 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-приложений, я имел успех только настройки контекста Raven (Sentry) в before_action внутри 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 

Это работает, потому что Ворон Rack промежуточного слоя очищает контекст после каждого запроса. See here. Это может быть не самым эффективным, однако, поскольку вы устанавливаете контекст даже в большинстве случаев, которые не приводят к исключению. Но в любом случае, это не так дорого, как операция, и она заставит вас довольно далеко, даже если вам не нужно возиться с внедрением нового промежуточного ПО Rack или чего-то еще.

+0

Это похоже на хороший способ сделать это. Я не использую Raven в настоящее время, поэтому не могу попробовать это, но это то решение, которое я искал. Пометьте свое решение как правильное, как только я получу шанс попробовать это с помощью Raven. – rohitmishra

Смежные вопросы