Sinatra - response.set_cookie不起作用

12

我需要在我的Sinatra应用程序中使用cookie。如果我使用最简单的方法,它可以工作:

response.set_cookie('my_cookie', 'value_of_cookie')

但是我需要一些选项,比如域名和过期日期,所以我尝试了这个:

response.set_cookie("my_cookie", {:value => 'value_of_cookie', :domain => myDomain, :path => myPath, :expires => Date.new})

无法正常工作,没有生成任何cookie。我非常需要这个...

请帮忙...谢谢!


你是如何确定没有生成Cookie的?浏览器Cookie存储?在应用程序中稍后使用?通过Wireshark读取传输的流量?':expire => Date.new'是否意味着Cookie应该“立即”过期? - sarnold
我在Firefox中使用一个cookie插件。 - claudiut
1个回答

17

http://sinatra-book.gittr.com/#cookies的文档中,建议使用 set_cookie 助手函数设置 Cookie,但在较新版本的 Sinatra(至少从 1.2.0+ 版本开始,可能更早),应该使用 response.set_cookie 来设置 Cookie。

response.set_cookie("my_cookie", :value => "value_of_cookie",
                    :domain => myDomain,
                    :path => myPath,
                    :expires => Date.new(2020,1,1))
cookie = request.cookies["my_cookie"]

摘要

不要将localhost设置为cookie的域,因为你需要将其设置为 "" 或 FALSE。


1
set_cookie 不再是一个 helper,现在它是 response.set_cookie()。这个应该是正确的,但是不起作用:http://www.gittr.com/index.php/archive/sinatra-cookie-handling-in-0-9-4/。 - claudiut
3
这个可以用:response.set_cookie('my_cookie', { :value => 'abc', :path => request.path, :expires => Time.now + (60 * 60 * 24 * 30) })。它会在一个月后过期。但是为什么 :domain 参数不起作用呢?如果 :domain => request.host,那么在我的情况下它应该是 'localhost'。如果我添加了这个参数,它就不起作用了……但是为什么呢? - claudiut
request.path 不会返回域名!!!对我来说,response.set_cookie("my_cookie", :value => "1234", :domain => ".smackaho.st") 完美运行。 - fl00r
尝试使用 request.env['SERVER_NAME']request.env['HTTP_HOST'] - fl00r
1
请参考以下关于将“localhost”设置为cookie域的内容:https://dev59.com/anNA5IYBdhLWcg3wAItP。在本地开发时,cookie域必须设置为“”,“NULL”或“FALSE”,而非“localhost”。 - fl00r
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接