我想跟踪网站的用户访问次数。如果之前的访问时间超过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?
谢谢
答案 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