gpt4 book ai didi

ruby - Sinatra cookie 未按预期运行

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:08 25 4
gpt4 key购买 nike

before %(/(..)/.*) do
lang = params[:captures].first
cookies[:lang] = lang
p cookies
end

get '/' do
p cookies
end

以上代码期望设置cookie lang在任何请求中使用两个字符的值 /xx/*其中 xx是任意两个字符的字符串。这按预期工作,如导航 /es/login将输出 <#Sinatra::Cookies::Jar: "ASP.NET_SessionId"=>"*snip*", "lang"=>"es"> .

如果我立即导航到 / , 它输出 <#Sinatra::Cookies::Jar: "ASP.NET_SessionId"=>"..", "lang"=>"en">

出于多种原因,这很奇怪,最值得注意的是我从未导航到 /en/* .我假设 cookies[:lang]没有正确设置 cookie,并且 en是一个正确设置为 lang 的值过去的某个时间,但我不知道有什么方法可以检查或修复它。

我应该注意到这是我唯一接触到 cookies 的地方项目中的对象。

初始化文件的片段:

require 'sinatra/base'
require 'sinatra/cookies'
...
class Site < Sinatra::Application
helpers Sinatra::Cookies
...
end

最佳答案

事实证明 cookie 是特定于路径的。

例如,/en/login 将拥有自己的一组适用于 /en/login/* 的 cookie,而 /将具有适用于 /* 的 cookie。因此,通过在 %r(/(..)/.*) 之前设置 cookies[:lang],我只是为任何路由设置 cookie /xx/*.

我通过使用 Sinatra 的 response.set_cookie 方法解决了这个问题,该方法允许我明确地将路径设置为 /。我也可以将 Cookies gem 的默认设置设置为 /,但我认为这是个糟糕的主意。

sinatra#set_cookie 的解决方案:

before $(/(..)/.* do
lang = params[:captures].first
response.set_cookie(:lang, lang)
end

通过设置 Cookies 的默认值来解决

require 'sinatra/base'
require 'sinatra/cookies'
...
def Site < Sinatra::Application
helpers Sinatra::Cookies
configure do
set :cookie_options, domain: nil
end
...
end

关于ruby - Sinatra cookie 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24782442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com