【问题标题】:How to access session variables from a Draper decorator in Rails?如何从 Rails 中的 Draper 装饰器访问会话变量?
【发布时间】:2014-12-19 14:30:51
【问题描述】:

我希望能够从装饰器访问会话变量。现在我不能这样做,也不能访问控制器实例变量,比如说@session_variable

有没有干净的方法来实现这一点?

谢谢!

【问题讨论】:

  • 我认为这个想法是装饰器应该是它装饰的模型的扩展。正因为如此,它变得复杂。我会将会话变量作为装饰器函数的输入参数。

标签: ruby-on-rails session-variables decorator instantiation draper


【解决方案1】:

当我需要控制器以外的任何对象来访问请求信息时,我喜欢使用我认为的上下文模式。它看起来像这样:

编写一个只有装饰器需要的接口的单例类(遵循接口隔离原则)。例如,假设您的装饰器需要知道用户是否登录。使用实例方法 user_is_logged_in? 创建一个 LoginContext 单例。装饰器可以通过调用LoginContext.instance.user_is_logged_in?来判断用户是否登录。

在您的ApplicationController 中添加一个before_filter,在运行操作之前根据会话将单例的user_is_logged_in 属性设置为truefalse。或者,如果您想确保在请求之外没有使用 LoginContext,请在运行操作后将过滤器设置为 around_filter 并将属性设置为 nil,并编写 user_is_logged_in? 访问器以便它如果属性为 nil,则会引发错误。

以上内容适用于单线程 Rails 应用程序服务器,但如果您使用线程应用程序服务器,您可以围绕特定于线程的单例编写相同的功能。

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多