Rails 3中的会话和cookie如何持久化会话ID cookie

3
我正在开发一个基于session_id的简单购物车,用于确定用户购物车中的商品。但是当用户关闭浏览器后再次打开它时,会更改session_id,导致他失去购物车中所有的商品。
我怀疑可以通过保存session_id到cookie中来提供这样的功能。这样做对吗?
无论如何,我的问题是如何提供一个功能,允许用户在关闭浏览器后仍然能够获取他们购物车中的物品?
3个回答

5
我建议阅读Rails指南:Action Controller概述(http://guides.rubyonrails.org/action_controller_overview.html)。其中第4和5节涵盖了Sessions和Cookies,将让您更深入地了解如何使用它们,并使您更容易应对未来的挑战。
我还建议查看Ruby on Rails ActionDispatch::Cookies < Object文档(http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html)。
您正在寻找的控制器代码示例在此资源中列出。以下是一个示例:
# Sets a cookie that expires in 1 hour.
cookies[:login] = { :value => "XJ-122", :expires => 1.hour.from_now }

我感到困惑。一方面,我在会话中持久化的所有数据(session[:some_key] = some_value)也会在用户端以cookie的形式持久化。另一方面,Rails提供了一种将数据存储在cookie中的方法,如cookie[:some_key] = some_value。如果我可以将数据存储在session[]中,为什么要将数据存储在cookie[]中呢? - Lesha Pipiev
一些Rails应用程序可能不使用会话,但仍然希望在用户浏览器上存储一些信息,这就是为什么存在cookies方法的原因。 - halmeetdave

3
cookies[:your_cookie] = {
    :value => "your_cookie_value",
    :expires => 100.years.from_now
}

更多细节请查看


那么,每当我的控制器更改会话中的某些内容或自动更改时,我都必须更新我的 cookie 吗? - Mauricio Moraes

2
Rails 默认将会话存储在 cookie 中。您可以影响 cookie 是否持续存在于浏览器重启之后(见下文)。
Cookie 永远不会在不同浏览器之间共享。
如果您想使用 Opera 查看您刚在 Firefox 中创建的购物车,您需要以某种方式对商店进行身份验证,例如使用用户名和密码。
请参阅 Rails 3 additional session configuration options (key, expires_after, secure),了解有关会话的所有配置选项的描述。
您可能希望查看 :expire_after,例如。
:expire_after => 24.hours

(在此找到:如何在Rails 3中设置会话超时时间

谢谢,很清楚。但是它不能在不同的浏览器中使用。例如,我在Firefox中添加了一些商品到购物车,然后关闭了Firefox并打开了Opera。不幸的是,在Opera中我看不到在Firefox中添加的商品。 - Lesha Pipiev

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