维护一个部署在Apache上的Rails v2.3.8应用程序,使用mod_passenger。
我需要在其中一个模型(确切地说是Auditor观察者)中访问当前用户会话。我知道这违反了MVC原则。但是我必须违反它,因为我有一个观察者需要知道当前登录的用户。我有很多控制器,将调用Auditor记录器放置在那里不太DRY。
我只是想能够调用User.current并返回当前已登录用户会话。然而,我遇到了缓存/线程安全问题。原始作者使用类变量(@@current)来存储当前用户。但这不是线程安全的,所以我将其转换为以下内容:
class User < AR:Base
...
def self.current
Thread.current[:user]
end
def self.current=(user)
Thread.current[:user] = user
end
...
end
所以它应该是线程安全的。在审计观察器中,我有一个调用:
Auditor(subject, action, object)
我在主题中传递User.current。
这段代码在开发中运行良好,但在生产中,我从User.current得到了错误的值。有时我会得到另一个已登录用户的记录而不是当前用户的记录。因此,仍然存在一些线程安全/类缓存问题,但我无法找出如何解决它。
有什么建议吗? 谢谢
:touch => :model_name
来更新关联。 - thenengah