我希望能够从Decorator访问会话变量。现在我不能这样做,也无法访问控制器实例变量,让我们说@session_variable
。
有没有一种干净的方法来实现这一目标?
谢谢!
答案 0 :(得分:0)
当我需要控制器以外的任何对象来访问请求信息时,我喜欢使用我认为的Context模式。它看起来像这样:
编写一个单独的类,它只包含装饰器所需的接口(遵循接口隔离原则)。例如,让我们说装饰者需要知道用户是否已登录。使用实例方法LoginContext
创建一个user_is_logged_in?
单例。装饰者可以通过调用LoginContext.instance.user_is_logged_in?
来确定用户是否已登录。
在您的before_filter
添加ApplicationController
,根据会话将单身人士的user_is_logged_in
属性设置为true
或false
,然后再运行行动。 (可选)如果要确保没有任何内容使用请求之外的LoginContext
,请在运行操作后将过滤器设置为around_filter
并将属性设置为nil
,然后编写{ {1}}访问器,如果属性为nil,则会引发错误。
以上内容适用于单线程Rails应用程序服务器,但如果使用线程应用程序服务器,则可以围绕特定于线程的单例编写相同的功能。