检查用户是否实时在线

问题描述 投票:4回答:3

我想在此时检查用户是否在线。这应该显示在用户配置文件中。

我在我的application_controller得到了这个

after_filter :user_activity

private

  def user_activity
    current_user.try :touch
  end

我在user-model中定义了这个

def online?
 updated_at > 10.minutes.ago
end

如果用户在线,我可以查看视图:(HAML)

- if @user.online?

这有效,但总是需要重新加载更新此信息所需的页面。它如何成为实时检查?也许使用ActionCable?

PS:使用devise

ruby-on-rails ruby-on-rails-5 actioncable
3个回答
5
投票

是的,可以使用Action Cable。 Rails指南有一半的例子:Action Cable Overview -- 6.1 Example 1: User Appearance

基本上,你创建一个AppearanceChannel,每个用户都订阅它。订阅调用appear函数用于current_user,然后可以通过像BroadcastAppearanceJob这样的后台作业广播出来(例如,向其他用户显示在线状态)。 (我刚刚开始研究这个问题)。


2
投票

我尝试使用Action Cable示例,但是我遇到了一些问题(当我重新启动服务器时没有调用.disappear,当用户打开多个标签时也难以处理...等等)

因此,最简单的工作解决方案是每5分钟调用一次服务器,如javascript:

setInterval(function(){
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "/i_am_still_here", true);
  xhttp.send();
}, 5*60*1000);

所以在控制器中

def i_am_still_here
  current_user.update(last_seen_at:DateTime.now)
end

在User.rb中

def is_online?
  last_seen_at > 5.minutes.ago
end

1
投票

最好的方法是使用客户端技术。服务器只能根据用户对服务器的最后请求知道用户是否处于活动状态。

用户可能在没有将请求发送到服务器的情况下浏览您的应用程序,并且会根据您的时间限制显示为不在线(即使它们处于活动状态)。

考虑使用websockets来完成此任务,无论是使用JavaScript,Obj-C / Swift还是Java。

© www.soinside.com 2019 - 2024. All rights reserved.