Поддержка приложения Rails v2.3.8, развернутого на Apache с помощью mod_passenger.
Мне нужен доступ к текущему сеансу пользователя в одной из моделей (точнее, наблюдатель 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 как subject.
Этот код отлично работает в разработке, но в продуктах я получаю неправильные значения из User.current. Иногда я получаю запись другого зарегистрированного пользователя, а не текущего. Спасибо