Ruby on rails 如何使用机架中间件同时设置cookie并发送响应,cookie生效

Ruby on rails 如何使用机架中间件同时设置cookie并发送响应,cookie生效,ruby-on-rails,rack,rack-middleware,Ruby On Rails,Rack,Rack Middleware,我正在尝试使用机架中间件设置cookie,并在同一请求-响应周期内发送cookie有效的响应 这里是上下文:我正在一个有两种模式的网站上工作:美国模式和英国模式(不同的徽标、导航栏、样式等)。当一个英国访问者第一次点击该页面时,我想在他的浏览器上设置一个“UK模式”cookie,同时也呈现该页面的英国版本。以下是我目前的代码: # middleware/geo_filter_middleware.rb def initialize(app) @app = app end def

我正在尝试使用机架中间件设置cookie,并在同一请求-响应周期内发送cookie有效的响应

这里是上下文:我正在一个有两种模式的网站上工作:美国模式和英国模式(不同的徽标、导航栏、样式等)。当一个英国访问者第一次点击该页面时,我想在他的浏览器上设置一个“UK模式”cookie,同时也呈现该页面的英国版本。以下是我目前的代码:

 # middleware/geo_filter_middleware.rb

 def initialize(app)
   @app = app
 end

 def call(env)
   status, headers, body = @app.call(env)
   response = Rack::Response.new(body, status, headers)
   if from_uk?(env)
      response.set_cookie('country', 'UK')
   end
   response.to_a
 end
当英国访问者第一次点击页面时,它会在cookie中设置“UK模式”,但仍会呈现页面的默认美国版本。只有在第二次请求之后,cookie才会生效,英国访问者才会看到英国模式


是否有人想到在一个请求-响应周期内同时设置cookie并返回cookie有效的响应?

您需要在应用程序中设置中间件。rb

config.middleware.insert_before "ActionDispatch::Cookies", "GeoFilterMiddleware"
在中间件中执行以下操作:

  def call(env)
    status, headers, body = @app.call(env)
    if from_uk?(env)
      Rack::Utils.set_cookie_header!(headers, 'country', { :value => 'UK', :path => '/'})
    end
    [status, headers, body]
  end

嘿,这看起来很有希望。谢谢你的回答!这看起来确实很有希望,但不起作用。它与问题中的现有代码具有相同的效果-设置了cookie,但不针对相同的请求。任何有效的操作都必须在执行@app.call(env)之前修改env