我希望能够从装饰器访问会话变量。现在我不能这样做,也不能访问控制器实例变量,比如说@session_variable
.
有没有一种干净的方法来实现这一目标?
谢谢!
我希望能够从装饰器访问会话变量。现在我不能这样做,也不能访问控制器实例变量,比如说@session_variable
.
有没有一种干净的方法来实现这一目标?
谢谢!
当我需要除控制器之外的任何对象来访问请求信息时,我喜欢使用我认为的上下文模式。它看起来像这样:
编写一个只有装饰器需要的接口的单例类(遵循接口隔离原则)。例如,假设您的装饰器需要知道用户是否登录。LoginContext
使用实例方法创建一个单例user_is_logged_in?
。装饰器可以通过调用来查明用户是否登录LoginContext.instance.user_is_logged_in?
。
在运行操作之前,将单例属性设置为或根据会话添加before_filter
到您的。可选地,如果您想确保没有使用请求的外部,请在运行操作后创建过滤器并将属性设置为,并编写访问器以便在属性为 nil 时引发错误。ApplicationController
user_is_logged_in
true
false
LoginContext
around_filter
nil
user_is_logged_in?
以上是针对单线程 Rails 应用程序服务器的,但是如果您使用线程应用程序服务器,您可以围绕特定于线程的单例编写相同的功能。