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

时间:2011-11-18 12:48:19

标签: 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

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

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:5)

问题是cookie是使用路径/cookie设置的。当您设置cookie时,您可以指定路径,该路径实际上是您希望cookie应用于网站的子部分。我猜Sinatra / Rack默认使用当前请求的路径,/cookie/set中的路径为/cookie

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

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

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