Thread.local [:current_user]的陷阱

时间:2011-06-27 21:42:49

标签: ruby-on-rails ruby-on-rails-3 thread-safety authlogic

此问题与:Access current_user in model

有关

具体来说,我想在一个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。

1 个答案:

答案 0 :(得分:1)

我不确定我是否同意你所走的道路。我同意将current_user传递给模型的其他帖子不合适,但我不会使用Thread.local。原因如下:

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

  2. 我想我会看看你想要做什么,看看是否有更简单的解决方案。例如,我可以想到两个副手(可能会在你的情况下工作或不工作):

  3. a)使用外键将历史记录表连接到用户表。 “belongs_to,has_many”;或
    b)在历史记录上传递带有attr_accessor的用户名,并在创建对象时设置该用户名。