2011-06-27 43 views
2

此问题与:Access current_user in modelThread.local的陷阱[:current_user]

具体而言,我想启用访问current_user在一个Model.rb。 @moif留下了一条评论,指出解决方案不是线程安全的,而且我已经读过使用此过程的其他注意事项。

我的问题是 - 如果我要补充:

def self.current_user 
    Thread.local[:current_user] 
end 

def self.current_user=(usr) 
    Thread.local[:current_user] = usr 
end 

一个Model.rb(只是轻轻地使用,很少),什么是我的应用程序在现实世界的影响,有什么额外的我要确保其健康?

设置:Rails 1.9,Rails 3.0,Heroku,Authlogic。

+0

好问题。我很想看到答案。我在我当前的项目中遇到了这个问题,并且真的不喜欢使用线程对象来传递变量 - 我的做法与上面的类似,它让我感觉很脏。 – jaydel

回答

1

我不确定我同意你所采取的路径。我同意另一篇文章,即将current_user传递给模型并不合适,但我不会为此使用Thread.local。这里的原因:

  1. 开发人员喜欢让技术与解决方案,并没有太多的更“接近系统”,你可以得到比Thread.local。使用Thread.locals之前,他们是非常棘手的,如果你没有得到它的权利,那么你花无数个小时试图找出问题,更不用说解决方案。很难找到能够理解Thread.local的复杂性并能够彻底测试代码的测试人员。事实上,我会想知道有多少开发人员将rspec测试(或等效的测试)放在一起进行类似的测试。这个解决方案的“成本”可能不值得。

  2. 我想我会看看你想做什么,看看有没有更简单的解决方案。例如,我能想到的两断手(也许会在你的情况下工作或没有):

一)你的历史记录表的外键连接到您的用户表。 “belongs_to,has_many”;或
b)将历史记录上的用户名与attr_accessor关联,并在创建该对象时进行设置。