1

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

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

这会很好用,除非我设计了 :rememberable 已打开。所以来自 :authenticate_user 的 SQL 调用序列!这是:

SELECT "users".* FROM "users" WHERE "users"."email" = 'person_1@example.com' LIMIT 1

更新“用户”设置“remember_created_at”='2012-11-21 20:13:53.011322',“updated_at”='2012-11-21 20:13:53.012791'其中“用户”。“id”= 1

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

谢谢

4

2 回答 2

0

我想你的任务不是那么简单。如果您有记忆,您应该跟踪用户的活动,而不是通过登录。应该有一个标准设置你所谓的“活动”:它只是返回到应用程序的页面还是点击链接或按钮。在Railscast关于从头开始的身份验证中,身份验证背后有一个逻辑。大概会有解决办法吧?就像在为 current_user 检查会话时设置回调一样。

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

于 2012-11-21T21:45:51.760 回答
0

我用 Warden 来解决这个问题。

初始化程序/设计.rb:

Warden::Manager.after_set_user do |user,auth,opts|
  user.increment(:visits).save! if user.updated_at < 30.minutes.ago
end
于 2012-11-22T23:41:01.757 回答