Swa*_*rtz 5 session ruby-on-rails thread-safety observer-pattern
使用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
Run Code Online (Sandbox Code Playgroud)
所以它应该是线程安全的.在Auditor观察员中,我有一个电话:
Auditor(subject, action, object)
Run Code Online (Sandbox Code Playgroud)
我在User.current中传递的主题.
这段代码在开发中很有用,但在制作中我从User.current获得了不正确的值.有时我得到另一个登录用户的记录而不是当前记录.所以仍然存在一些线程安全/类缓存问题,但我无法弄清楚如何修复它.
有什么建议?谢谢
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
Run Code Online (Sandbox Code Playgroud)
选项 2 - 拥有一个在修改用户对象后执行操作的用户模型。
在您的用户模型中:
before_save :adjust_user
def adjust_user
#self will be the object that was just modified aka the current user
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3431 次 |
| 最近记录: |