2012-03-15 88 views
0

有很多關於這個問題的問題,「如何訪問CURRENT_USER模型」,我嘗試了一些,並最終做了「老辦法」,設置問題模型訪問CURRENT_USER

cattr_accessor :current_user 

FeedObserver,並設置

FeedObserver.current_user = current_user 

在我ApplicationController中用的before_filter。

不幸的是,它似乎沒有按預期工作,有時在FeedObserver中使用了不同的用戶。

我使用rails 3.2.2,ruby 1.9.3p0,nginx,獨角獸。我無法真正解釋這種行爲,因爲 before_filter應該爲每個請求設置current_user,並且不應該被其他用戶覆蓋...?

class FeedObserver < ActiveRecord::Observer 
    cattr_accessor :current_user 
    observe :account, :user 

    def after_create(ressource) 
    log!(ressource) 
    end 

    def log!(ressource, event_name) 
    feed_item = FeedItem.new(
     user: current_user, 
     data: ressource.changes, 
     account_id: current_user.account.id 
    ) 
    feed_item.save if feed_item.valid? 
    end 
end 

回答

0

我推薦的sentient_user寶石你的目的

+0

是的,我檢查了代碼,並使用了「線程方法」。這很好,但我需要知道爲什麼我的代碼不工作,也許這種方法會發生同樣的問題。 (也需要設置更多,然後只是current_user) – fluxsaas 2012-03-15 20:03:02

0

不知道是什麼原因造成的錯誤,我想這只是它覆蓋了變量的併發請求。作爲@Andrei建議我嘗試了sentient_user gem。但sentient_user具有可與解決同樣的問題:

module SentientController 
    def self.included(base) 
     base.class_eval { 
     around_filter do |controller, action| 
      User.current = controller.send(:current_user) 
      begin 
      action.call 
      ensure 
      User.current = nil 
      end  
     end 
     } 
    end 
    end 

修復該線程泄漏問題...