1

我的代码很大程度上取决于用户是否在线。

目前我已经像这样设置了 ActionCable:

class DriverRequestsChannel < ApplicationCable::Channel
  def subscribed
      stream_from "requests_#{current_user.id}"
  end

  def unsubscribed
    current_user.unavailable! if current_user.available?
  end
end

现在我最想介绍的是用户只是关闭浏览器而不是离线的情况。然而,取消订阅的问题是它会进行页面刷新。因此,每次他们刷新页面时,他们都会触发unsubscribed. 因此,即使他们认为它们可用,它们也会被设置为不可用。

现在关键是可用不是默认设置,所以我可以把它放回去,这是用户为了接收请求而选择的。

有没有人有处理此类案件的最佳方式的经验?

4

1 回答 1

1

您不仅应该依赖 Websockets,还应该将用户在线状态放入数据库:

1:添加迁移

class AddOnlineToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :online, :boolean, default: false
  end
end

2:添加AppearanceChannel

class AppearanceChannel < ApplicationCable::Channel
  def subscribed

    stream_from "appearance_channel"

    if current_user

      ActionCable.server.broadcast "appearance_channel", { user: current_user.id, online: :on }

      current_user.online = true

      current_user.save!

    end


  end

  def unsubscribed

    if current_user

      # Any cleanup needed when channel is unsubscribed
      ActionCable.server.broadcast "appearance_channel", { user: current_user.id, online: :off }

      current_user.online = false

      current_user.save!      

    end


  end 

end

现在,您可以保证不会出现任何偶然的 Websockets 连接丢失。在每次 HTML 页面刷新时做两件事:

  1. 检查数据库的用户在线状态。
  2. 连接到套接字并订阅外观频道。

这种组合方法将随时可靠地为您提供用户的在线状态。

于 2017-04-13T10:06:03.763 回答