使用mod_passenger维护部署在Apache上的Rails v2.3.8应用程序。
我需要访问其中一个模型中的当前用户会话(确切地说是Auditor观察者)。 我知道这打破了MVC的原则。但我必须违反它,因为我有一个需要知道当前登录用户的观察者。我有很多控制器,并且调用Auditor记录器也不会很干。
我只是想在返回当前登录的用户会话时调用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观察员中,我有一个电话:
Auditor(subject, action, object)
我将User.current作为主题传递。
此代码在开发中非常有用,但在制作中,我从User.current获取的值不正确。有时我得到另一个登录用户的记录而不是当前记录。所以仍然存在一些线程安全/类缓存问题,但我无法弄清楚如何修复它。
有什么建议吗? 感谢
答案 0 :(得分:3)
ActiveRecord和ActionPack完全不同,因此您无法访问模型中的会话/ cookie。如果您需要当前用户,您有两个选择。
选项1 - 将当前用户传递给模型
在您的控制器中:
def index
Audit.get_current_user(current_user)
#where audit is your model that you will send the current_user to
end
选项2 - 拥有在修改用户对象后执行操作的用户模型。
在您的用户模型中:
before_save :adjust_user
def adjust_user
#self will be the object that was just modified aka the current user
end