3

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

有没有一种干净的方法来实现这一目标?

谢谢!

4

1 回答 1

0

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

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

在运行操作之前,将单例属性设置为或根据会话添加before_filter到您的。可选地,如果您想确保没有使用请求的外部,请在运行操作后创建过滤器并将属性设置为,并编写访问器以便在属性为 nil 时引发错误。ApplicationControlleruser_is_logged_intruefalseLoginContextaround_filterniluser_is_logged_in?

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

于 2016-02-14T03:39:04.743 回答