我试图从自定义Rack中间件对象的Rails参数哈希值中添加一个值。我目前的方法是使用
class PortalResolver
def initialize(app)
@app = app
end
def call(env)
begin
url = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}"
request = Rack::Request.new(env)
portal_id = DomainService.domain(url) # DomainService is returning the expected value
request.params['portal_id'] = portal_id
status, headers, response = @app.call(env)
[status, headers, response]
rescue PortalNotFoundError => e
[403, {'Content-Type' => 'text/html'}, ['']]
end
end
end
我目前正在ActionDispatch :: ParamsParser之后添加中间件。这些参数不会出现在来自控制器的Rails params散列中,但会显示在request.params散列中(在上面定义的中间件对象中)。任何想法?非常感谢。
答案 0 :(得分:15)
docs for Rack::Request#params
说:
请注意,修改不会在env中保留。如果您想要破坏性地修改参数,请使用update_param或delete_param。
使用
行时request.params['portal_id'] = portal_id
将新参数添加到为Rack :: Request实例创建的哈希中,但不会修改传递给rails的env
。要在Rack堆栈中进一步提供新值,请使用update_param
作为文档建议:
request.update_param('portal_id', portal_id)