让用户"在线"使用ActionCable

时间:2016-06-07 21:57:08

标签: ruby-on-rails actioncable

我的代码非常依赖于用户是否在线。

目前我已经像这样设置了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。因此,即使他们认为他们可以使用,他们也会被视为不可用。

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

有没有人有处理此类案件的最佳方法?

1 个答案:

答案 0 :(得分: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. 连接到套接字并订阅外观频道。
  3. 这种组合方法可以随时为您提供用户的在线状态。