2012-03-15 155 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 

修复该线程泄漏问题...