Поддержка приложения Rails v2.3.8, развернутого на Apache с mod_passenger.
Мне нужен доступ к текущему сеансу пользователя в одной из моделей (точнее, в качестве наблюдателя-аудитора).
Я знаю, что это нарушает принцип MVC. Но я должен нарушить его, так как у меня есть наблюдатель, который должен знать, кто в данный момент вошел в систему. У меня много контроллеров, и размещение звонка в Auditor logger не будет очень СУХОЙ.
Я просто пытаюсь вызвать 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(subject, action, object)
Где я передаю User.current в качестве субъекта.
Этот код прекрасно работает в разработке, но в продуктах я получаю неправильные значения из User.current. Время от времени я получаю другую зарегистрированную запись пользователя, а не текущую. Таким образом, существует некоторая проблема с безопасностью потоков / кэшированием классов, которая все еще существует, но я не могу понять, как ее исправить.
Есть предложения?
Спасибо