使用Devise in Rails存储用户访问次数

时间:2012-11-21 21:03:32

标签: ruby-on-rails devise

我想跟踪网站的用户访问次数。如果之前的访问时间超过30分钟,则访问计数器(用户模型的一部分)会增加。我正在使用Rails和Devise:

class ApplicationController < ActionController::Base
  before_filter :authenticate_user!
  before_filter :update_visits

  def update_visits
    current_user.increment!(:visits) if !current_user.nil? && current_user.updated_at < 30.minutes.ago
  end
end

这会很有效,除了我设计:可记住的开启。所以SQL调用的顺序来自:authenticate_user!是这样的:

  

SELECT“users”。* FROM“users”WHERE“users”。“email”='person_1@example.com'LIMIT 1

     

更新“用户”SET“remember_created_at”='2012-11-21   20:13:53.011322',“updated_at”='2012-11-21 20:13:53.012791'在哪里   “users”。“id”= 1

因此,访问变量永远不会增加,因为updated_at设置为可记忆调用中的当前时间。如何在验证之后但在记忆之前调用update_visits?

谢谢

2 个答案:

答案 0 :(得分:0)

我认为你的任务不是那么简单。如果您有可记住的情况,则应该通过登录来跟踪用户的活动。应该有一个标准设置你称之为“活动”:它只是返回应用程序页面或点击链接或按钮。在关于身份验证的Railscast中,身份验证背后有一个逻辑。可能有解决方案吗?就像在为current_user检查会话时设置回调一样。

编辑:看看this discusion。有多种方法可以通过Warden::Manager跟踪当前用户的身份验证请求时间。

答案 1 :(得分:0)

我用Warden来解决这个问题。

初​​始化/ devise.rb:

Warden::Manager.after_set_user do |user,auth,opts|
  user.increment(:visits).save! if user.updated_at < 30.minutes.ago
end