Rails:访问模型中的当前用户会话(

时间:2011-03-18 23:49:16

标签: ruby-on-rails session 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

所以它应该是线程安全的。在Auditor观察员中,我有一个电话:

Auditor(subject, action, object)

我将User.current作为主题传递。

此代码在开发中非常有用,但在制作中,我从User.current获取的值不正确。有时我得到另一个登录用户的记录而不是当前记录。所以仍然存在一些线程安全/类缓存问题,但我无法弄清楚如何修复它。

有什么建议吗? 感谢

1 个答案:

答案 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