【发布时间】:2013-12-02 11:41:44
【问题描述】:
我在我的应用中实现了一个购物车。
在我的ApplicationController.rb,我有这个:
before_filter :initialize_cart
def initialize_cart
if session[:cart_id]
@cart = Cart.find(session[:cart_id])
else
@cart = Cart.create
session[:cart_id] = @cart.id
end
end
我正在使用 Devise,并启用了:timeoutable。
这些是我config/initializers/devise.rb 中的配置:
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
config.timeout_in = 30.minutes
# If true, expires auth token on session timeout.
config.expire_auth_token_on_timeout = true
问题是我偶尔想清扫旧车。就目前而言,一旦有一段时间没有访问购物车,它就会被删除。
但是,当用户尝试登录时 - 如果他们有一段时间没有清除 cookie - 他们会收到以下错误:
ActiveRecord::RecordNotFound at /
Couldn't find Cart with id=51
我检查了会话对象的创建或更新时间戳,但它没有 - 所以我无法检查会话的状态并删除超过 30 分钟或其他时间的会话。
这是会话对象的样子:
>> session
=> {"session_id"=>"57bkhjadksjfhaksjdhfca", "cart_id"=>51, "_csrf_token"=>"3823j42&*&@#lkjM+wKkagdabskdjfhba="}
我如何检查会话是否是最近的(比如用户 - 已登录和未登录 - 在过去一小时内做了某事),如果不是,则将其销毁?
或者我该如何以其他方式解决此问题?
【问题讨论】:
-
也许在创建购物车时将您自己的
modified参数添加到购物车,然后查看上次修改(创建或更新)的时间 -
@dax 你能举个例子说明你的意思吗?
-
timoutable 模型有一个方法
timedout?在这种情况下不会有帮助吗?这是一个参考链接:rubydoc.info/github/plataformatec/devise/master/Devise/Models/… -
不确定如何在非
current_user用户上使用它 - 即尚未登录的用户,因此我无法致电current_user.timedout?。另外...如果我没记错的话,那只会跟踪已登录的用户。在我的应用程序中,用户无需先登录即可将内容添加到购物车中。它会在他们创建帐户之前创建一个会话。这就是我要处理的问题。
标签: ruby-on-rails ruby-on-rails-3 session devise