如何跟踪用户是否进行任何操作Rails应用程序

时间:2017-07-13 13:42:51

标签: ruby-on-rails ruby devise

我正在创建带有课程/测试的应用程序,现在我需要创建一个包含一些信息的成绩单。我想向用户添加列,以跟踪在线时间(无空闲时间)。例如,学生按现场的任何按钮(例如),这意味着学生在线并且(current_user.online_time不应该停止),但如果学生没有做超过5分钟 - (current_user.online_time应该停止)。我找到了一颗宝石devise lastseenable,但无法想象如何根据我的意愿使它成功。当U仅对用户(创建/更新/删除/或属于用户的模型)执行任何操作时,Gem跟踪,而不跟踪任何其他移动。有人可以给我任何想法吗?

1 个答案:

答案 0 :(得分:1)

当然可以将一个简单的用户跟踪功能组合在一起,而无需使用专门为此目的而构建的外部gem。以下是所需实施步骤的列表:

<强> 1。将total_time_onlinelast_seen_at字段添加到User

  • total_time_online将包含用户在线观看的秒数
  • last_seen_at将保留用户上次与网站进行互动的日期和时间

<强> 2。将active_now!方法添加到User

只要用户与网站进行交互,就会调用此方法。它负责增加total_time_online值并更新last_seen_at字段:

class User
  ActivityThreshold = 5.minutes
  # ...
  def active_now!
    time_since_last_activity = [Time.now - last_seen_at, 0].max

    if time_since_last_activity <= ActivityThreshold
      self.total_time_online ||= 0
      self.total_time_online += time_since_last_activity
    end

    self.last_seen_at = Time.now
    save!
  end
  # ...
end

如果最后一次互动不到5分钟,这只会增加total_time_online

第3。在每个请求上致电当前用户active_now!

全局before_action应该可以解决问题:

class ApplicationController < ActionController::Base
  # ...
  before_action :record_user_activity
  # ...
  private
  # ...
  def record_user_activity
    current_user.active_now! if current_user
  end
end