Как получить доступ к переменным сеанса из декоратора Draper в Rails?
Я хочу иметь возможность получить доступ к переменной сеанса из декоратора. Теперь я не могу этого сделать, и я не могу получить доступ к переменным экземпляра контроллера, скажем, @session_variable
,
Есть ли чистый способ добиться этого?
Спасибо!
1 ответ
Когда мне нужен какой-либо объект, кроме контроллера, чтобы иметь доступ к информации запроса, мне нравится использовать то, что я считаю шаблоном контекста. Это выглядит так:
Напишите одноэлементный класс, имеющий только тот интерфейс, который необходим вашему декоратору (следуя принципу разделения интерфейса). В качестве примера, скажем, что ваш декоратор должен знать, вошел ли пользователь в систему. LoginContext
синглтон с методом экземпляра user_is_logged_in?
, Декоратор может узнать, вошел ли пользователь, вызвав LoginContext.instance.user_is_logged_in?
,
Добавить before_filter
на ваш ApplicationController
который устанавливает синглтон user_is_logged_in
приписывать true
или же false
в соответствии с сеансом перед запуском действия. По желанию, если вы хотите убедиться, что ничего не использует LoginContext
за пределами запроса, сделать фильтр around_filter
и установите атрибут в nil
после запуска действия, и напишите user_is_logged_in?
аксессор, так что возникает ошибка, если атрибут равен нулю.
Вышесказанное относится к однопоточным серверам приложений Rails, но вы можете написать ту же функциональность вокруг одноэлементного потока, если вы используете многопоточный сервер приложений.