在我的Rails 3.2应用程序中,我必须在某个类类型的中间件实例上调用一个方法。
我尝试使用Rails.application.middleware
,但这不起作用,因为它只包装中间件类而不是它们的实例。
现在我正在使用Ruby的Rails.application.app
和instance_variable_get
从is_a?
开始走中间件链,但这感觉不对,特别是因为没有指定的中间件方式存储上下文。例如,Rack::Cache::Context
将下一个实例存储在名为@backend
的变量中,而大多数其他实例使用@app
。
有没有更好的方法来查找中间件实例?
答案 0 :(得分:5)
您可以将中间件添加到机架环境中,如下例所示:
require 'rack'
class MyMiddleware
attr_accessor :add_response
def initialize app
@app = app
end
def call env
env['my_middleware'] = self # <-- Add self to the rack environment
response = @app.call(env)
response.last << @add_response
response
end
end
class MyApp
def call env
env['my_middleware'].add_response = 'World!' # <-- Access the middleware instance in the app
[200, {'Content-Type'=>'text/plain'}, ['Hello']]
end
end
use MyMiddleware
run MyApp.new