Я пытаюсь найти способ обнаружить, что последнее окно или вкладка для пользователя закрывается, чтобы я мог выполнить некоторую очистку; но я не могу найти способ определить, что это на самом деле последнее соединение для пользователя. У меня есть модель, которая отслеживает подключения к моим каналам, и я не хочу удалять запись подключения пользователя, когда он отключается, если у него открыты другие активные вкладки с подключениями.
Поэтому мне нужно каким-то образом проверить каждое отключение, чтобы увидеть, есть ли у них другие активные подключения с тем же идентификатором.
Я попытался настроить проверку RemoteConnections в методе отключения. Но когда это вызывается, кажется, что закрывающееся соединение все еще возвращается в RemoteConnections.
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = find_verified_user
logger.add_tags 'ActionCable', current_user.username
logger.debug self.current_user.username + " now connected."
end
def disconnect
self.close()
logger.debug ActionCable.server.remote_connections.where(current_user: current_user)
logger.debug ActionCable.server.remote_connections.where(current_user: current_user).identifiers
logger.debug ActionCable.server.remote_connections.where(current_user: current_user).identifiers.inspect()
end
end
Эта настройка возвращает следующее, даже если последнее соединение, использующее этот идентификатор, закрывается:
[ActionCable] [[email protected]] UserChannel stopped streaming from user:Z2lkOi8vYWxseWNoYXQvVXNlci80Nw
[ActionCable] [[email protected]] #<ActionCable::RemoteConnections::RemoteConnection:0x00000007062690>
[ActionCable] [[email protected]] #<Set:0x00000007791b78>
[ActionCable] [[email protected]] #<Set: {:current_user}>
До сих пор я обращался к этому, настроив модель только для отслеживания соединений, когда они открываются и закрываются для каждого канала. Но это добавляет много накладных расходов, и это беспорядок в управлении.
Может ли кто-нибудь предложить способ управления этим? Я просматривал документацию API для ActionCable и ничего не нашел.