2

我正在尝试理解可超时模块的设计源代码我真的很困惑该timedout?方法发生了什么。

直观地说,您应该能够在user.timedout?没有任何参数的情况下调用,如果用户的会话超时,它将返回 true,否则返回 false。有人可以解释这个参数在做什么吗?

编辑:好的,所以如果您已经知道他们的最后一次访问时间
,这种方法似乎只能检查用户是否超时。我想我的下一个问题是:检查其他用户是否超时的最干净的方法是什么?(不是当前用户)。也就是不带参数怎么按上面指定的方式调用呢?timedout?

4

1 回答 1

2

Devise 将使用 Warden 来存储最后一次请求时间(不是最后一个 signed_in_time)。见:https ://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb

因此,如果您想复制此功能,您需要将 last_request_time 存储在数据库中并随每个请求更新它(在 application_controller 中的 after_filter 中)。

一旦那里,您可以将此方法添加给用户,并使用它来委托设计超时?方法:

class User < ActiveRecord::Base
  devise :timeoutable, :trackable #etc

  def expired?
    valid_until = last_access_time + 30.minutes
    timedout?(valid_until)
  end

end

那么如果你有一个用户:

user.expired?
于 2012-06-03T16:00:40.510 回答