如何在中间件中设置一个可在我的所有应用程序中访问的变量?

我正在使用Ruby on Rails 3,我正在尝试使用中间件来设置变量@variable_name以后可以在控制器中访问。

例如,我的中间件是

  class Auth def initialize(app) @app = app end def call(env) @account ||= Account.find(1) @app.call(env) end end 

上面的代码正确设置了@account变量,但在我的应用程序中没有(在控制器,模型,视图……中)。 那么, 我该怎么做呢?


我看到这个答案是一种方法来做我需要的,但我希望@account变量“可以直接访问”。 也就是说,不使用这种方式,但在可见的情况下,例如在我的视图中,如下所示:

  

您可以使用’env’。 所以在你的中间件中你这样做:

 def call(env) env['account'] = Account.find(1) @app.call(env) end 

您可以在应用中使用“请求”获取值:

 request.env['account'] 

请不要使用全局变量或类属性,正如有些人在这里建议的那样。 这是让自己陷入麻烦的可靠方法,而且确实是一种坏习惯。

我不知道这是否可以用Middelware完成。 我的建议是这样的:

 class ApplicationController < ActionController::Base protect_from_forgery before_filter :set_my_var private def set_my_var @account ||= Account.find(1) end end 

这样,所有控制器和视图都可以访问@account

您可以在任何模型中使用cattr_accessor:my_var,并从中间件设置此变量

   MyModel.my_var ='某事'

您可以在应用程序的任何位置访问它。

您是否尝试过创建Ruby全局变量?

 def call(env) $account ||= Account.find(1) @app.call(env) end 

 <%= debug $account %>