我正在尝试使用Rack Middleware设置cookie并在同一请求 - 响应周期中发送一个响应cookie的响应。
以下是上下文:我正在使用两种模式的网站:美国模式和英国模式(不同的徽标,导航栏,样式等)。当英国访问者第一次访问该页面时,我想在他的浏览器上设置一个“英国模式”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?
答案 0 :(得分:3)
您需要在application.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