我想在Ruby on Rails应用程序中记录用户的操作.
到目前为止,我有一个模型观察器,它在更新和创建后将日志插入数据库.为了存储哪个用户执行了记录的操作,我需要访问会话,但这是有问题的.
首先,它打破了MVC模型.其次,技术范围从hackish到outlandish,甚至可能甚至将实现绑定到Mongrel服务器.
什么是正确的方法?
嗯,这是一个棘手的情况.你几乎必须违反MVC才能让它运行良好.
我会做这样的事情:
class MyObserverClass < ActiveRecord::Observer cattr_accessor :current_user # GLOBAL VARIABLE. RELIES ON RAILS BEING SINGLE THREADED # other logging code goes here end class ApplicationController before_filter :set_current_user_for_observer def set_current_user_for_observer MyObserverClass.current_user = session[:user] end end
它有点hacky,但它并不比我见过的许多其他核心轨道更糟糕.
所有你需要做的就是使它成为线程安全的(这只在你运行jruby时才有意义)是将cattr_accessor改为一个合适的方法,并让它将它的数据存储在线程本地存储中