来自Rack中间件的Alter Rails params哈希

sil*_*m99 11 ruby rack ruby-on-rails

我试图从自定义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
Run Code Online (Sandbox Code Playgroud)

我目前正在ActionDispatch :: ParamsParser之后添加中间件.这些参数不会出现在来自控制器的Rails params散列中,但会显示在request.params散列中(在上面定义的中间件对象中).任何想法?非常感谢.

mat*_*att 17

对文档Rack::Request#params说:

请注意,修改不会在env中保留.如果要破坏性地修改params,请使用update_paramdelete_param.

当你使用该行

request.params['portal_id'] = portal_id
Run Code Online (Sandbox Code Playgroud)

您将新参数添加到为Rack :: Request实例创建的哈希中,但env不会修改传递给rails 的哈希值.要在Rack堆栈中进一步使用新值,请使用update_param文档建议:

request.update_param('portal_id', portal_id)
Run Code Online (Sandbox Code Playgroud)