我有一个 rails 使用 Devise 对用户进行身份验证的应用程序,但我想跟踪平台中用户的在线时间。我希望在用户表中有一个列,可以为该用户节省在线时间(小时、分钟......)。例如,一个用户总共在线 2 小时,另一个用户 15 分钟......
是否存在此功能的一些 gem 或 Devise 方法?
提前致谢。
最佳答案
自 DEVICE
专卖店 last_sign_in_at
一旦用户登录帐户并成为 online
.
你可以做这样的事情。
添加 migration
更改用户表并添加字段,total_online_time
rails g migration add_total_online_time_to_users total_online_time:Float
向您的应用程序 Controller 添加一个 before action 回调以检查用户操作:
before_action :set_online_time, if: proc { user_signed_in? }
在这个方法中,我会得到 last_sign_in_at
由于我有当前时间,我将获得这些时间的差异并存储在 DB
中。作为分钟和秒。
再次,如果他登录,我会将这个时间添加到旧时间。
目前我正在保存分秒。由于我不能直接添加两次。
编辑:
我节省了几分钟,因为如果我们将字符串或时间保存在数据库中,我们无法在旅途中添加最后一个值和当前值。所以就是这样。
def set_online_time
start_time = current_user.last_sign_in_at.to_time;
end_time = Time.now;
if(start_time && end_time)_
minutes = time_diff(start_time, end_time)
if(current_user.total_online_time)
minutes = current_user.total_online_time + minutes
current_user.update_attribute(:total_online_time, minutes)
end
end
这是操纵时间的方法:
private
def time_diff(start_time, end_time)
(start_time - end_time) / 60
end
现在,从
DB
检索分钟并转换为 HH:MM:SS
这是方法,
Time.at(seconds).utc.strftime("%H:%M:%S")
所以,
Time.at((current_user.total_online_time) * 60).utc.strftime("%H:%M:%S")
是你的。这是一个例子:
time1 = Time.now => 2017-01-27 18:01:42 +0530
time2= Time.now - 4.hours => 2017-01-27 14:02:02 +0530
minutes = time_diff(time1,time2) => 239.66325946553334
Time.at((minutes) * 60).utc.strftime("%H:%M:%S") => "03:59:39"
So, "03:59:39" is the online time.
注:
1)每当用户登录时,此答案都会不断增加用户的在线时间。
2)如果你只想要最后一次,只需使用,
minutes = time_diff(start_time, end_time)
current_user.update_attribute(:total_online_time, minutes)
您还可以增加一个字段并节省当前的在线时间。
关于ruby-on-rails - 如何跟踪一个用户在线的时间?使用 Ruby on Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41892204/