为什么Devise超时?拿一个参数?

时间:2012-06-03 15:13:41

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我正在尝试理解Devise source code for the timeoutable module我对timedout?方法发生的事情感到困惑。

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

修改:
好的,所以看起来这个方法只能检查用户是否已经超时,如果你已经知道他们的上次访问时间。我想我的下一个问题是:检查其他用户是否超时的最简洁方法是什么? (不是current_user)。也就是说,如何以上面指定的方式调用timedout?,没有参数?

1 个答案:

答案 0 :(得分:2)

Devise将使用Warden存储上次请求时间(不是last_in_time)。请参阅:https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb

因此,如果要复制此功能,则需要将last_request_time存储在数据库中并使用每个请求进行更新(在application_controller中的after_filter中)。

一旦那样,您可以将此方法添加到用户,并使用它来委托设计timedout?方法:

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

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

end

然后如果你有一个用户:

user.expired?