我的代码非常依赖于用户是否在线。
目前我已经像这样设置了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
。因此,即使他们认为他们可以使用,他们也会被视为不可用。
现在关键是可用的不是默认设置,所以我可以把它放回去,这是用户为了接收请求而选择的东西。
有没有人有处理此类案件的最佳方法?
答案 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页面上刷新做两件事:
这种组合方法可以随时为您提供用户的在线状态。