Sinatra饼干在某些路线上消失了吗?

Gro*_*fit 2 ruby cookies sinatra

我有一个简单的Sinatra应用程序,我正在玩,由于某种原因,cookie似乎不适用于某些路线,我觉得很奇怪.

require "sinatra"

set(:authenticate) do |*vars|
    condition do
        unless request.cookies.has_key?("TestCookie")
            redirect to("/login"), 303 
        end
    end
end

get "/login" do
    return "No valid cookie"
end

get "/secret", :authenticate => [:auth_cookie] do
    cookie = request.cookies["TestCookie"]
    return "Secrets ahoy - #{cookie}"
end

get '/cookie/set' do
    response.set_cookie("TestCookie", {
        :expires => Time.now + 2400,
        :value => "TestValue"
    })
    return "Cookie is set"
end

get '/cookie/get' do
    cookie = request.cookies["TestCookie"]
    return "Cookie with value #{cookie}"
end
Run Code Online (Sandbox Code Playgroud)

如果我去cookie /设置它正确设置cookie(可以在firecookie中看到它),那么如果我去cookies /得到我得到正确的cookie输出.但是,如果我去/ secret它总是重定向到/ login.由于我仍然是Ruby语法的新手,我认为这可能是我的条件在authenticate扩展中的问题,所以我尝试删除它并像其他人一样吐出cookie.但仍然没有,所以我不知道为什么cookie在那里,我可以在浏览器中看到...和/ cookies/get工作,但/秘密不...

我在这里错过了什么吗?

Ste*_*eve 5

问题是cookie是用路径设置的/cookie.当您设置cookie时,您可以指定路径,该路径实际上是您希望cookie应用于网站的子部分.我想西纳特拉/机架在默认情况下,其在使用当前请求的路径/cookie/set/cookie.

您可以通过显式指定路径使其按预期方式工作:

  response.set_cookie("TestCookie", {
    :expires => Time.now + 2400,
    :value => "TestValue",
    :path => '/'
  })
Run Code Online (Sandbox Code Playgroud)

或者你可以在名为say /cookie-set而不是的路线上设置cookie/cookie/set