我想在此时检查用户是否在线。这应该显示在用户配置文件中。
我在我的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
是的,可以使用Action Cable。 Rails指南有一半的例子:Action Cable Overview -- 6.1 Example 1: User Appearance
基本上,你创建一个AppearanceChannel
,每个用户都订阅它。订阅调用appear
函数用于current_user
,然后可以通过像BroadcastAppearanceJob
这样的后台作业广播出来(例如,向其他用户显示在线状态)。 (我刚刚开始研究这个问题)。
我尝试使用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
最好的方法是使用客户端技术。服务器只能根据用户对服务器的最后请求知道用户是否处于活动状态。
用户可能在没有将请求发送到服务器的情况下浏览您的应用程序,并且会根据您的时间限制显示为不在线(即使它们处于活动状态)。
考虑使用websockets来完成此任务,无论是使用JavaScript,Obj-C / Swift还是Java。