2013-12-10 22 views
6

Sorumun fazla bilgi vermemiz gerekirse, bu Github konuya bakın - Hata logger olduğunu raven kullanıyorum https://github.com/getsentry/raven-ruby/issues/144current_user öğesini middleware'de nasıl ayarlayabilirim?

. Ben kullanıcı oturum halinde current_user için id eklemek istiyorum. Aldığım yanıt Bu katman veya bir yere benzer yoluyla yapılmalıdır

oldu. bu Raven içinde örnein ayarı demektir

.

Orta sınıflar hakkında okudum, ancak hala bir tanesinde current_user'u nasıl edinebileceğimi anlayamadım.

cevap

0

Raven hakkında pek bir fikrim yok, ancak aşağıda, geçerli kullanıcılara bir isteğimiz olan tüm uygulamalarımız üzerinden erişebilmemizin bir yoludur.

Biz bir önbellek görevi gören bir sınıf oluşturduk ve ekler/akım iplik

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 

Ve sonra, istek alındığında, geçerli oturum için bir onay gerçekleştirilir verileri alır, ve daha sonra kullanıcının modeli Şimdi

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 

aşağıda önbelleğinde yerleştirilir, sen aşağıdaki kodu kullanarak, uygulamanızda herhangi bir yerden geçerli kullanıcı alabilirsiniz

Bu yardımcı olur

Biz de önce ve istek hizmet edildikten sonra önbelleği sıfırlamak için emin olun, bu yüzden bunu,

CustomCache.reset 

Umut. Raylar uygulamalar için

+1

Bu ilginç görünüyor. Devise'nin middleware'de kullanabileceğim bir current_user yöntemi olup olmadığını merak ediyordum. – rohitmishra

14

, ben başarı sadece Raven (Nöbetçi) bağlamı ayarı yaşadım bir before_actionApplicationController iç: kuzgun Raf katman her istekten sonra bağlamını temizler çünkü

# 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 

Bu çalışır. See here. Ancak, bu durum, bir Özel Durum ile sonuçlanmayan durumların çoğunda bile bağlamı belirlediğiniz için, en verimli olmayabilir. Ama her halükarda, bu bir operasyonun pahalı değil, ve gerçekten de yeni Rack ara yazılım ya da herhangi bir şey enjekte etmekle gerçekten uğraşmanız gerekecek.

+0

Bunu yapmak için iyi bir yol gibi görünüyor. Raven'ı şu anda kullanmıyorum, bu yüzden bunu deneyemem ama bu aradığım çözüm. Bunu Raven ile denemeye karar verdiğimde çözümünüzü doğru olarak işaretleyeceğim. – rohitmishra

İlgili konular