2016-03-03 3 views
2

Возможно ли вернуть имя подписчика без подписки на отмененный метод?Клиент, не подписавшийся с канала

Когда пользователь отказывается от подписки на канал (из-за отключения или перехода от него), мне нужно убедиться, что флаги клиента установлены в нулевое состояние. Я создал метод очистки, но я не могу выяснить, какой канал следует отправить сообщению очистки. Так как я не могу получить, с какого канала вызывается метод отмены подписки.

class ConversationChannel < ApplicationCable::Channel 
    def follow(data) 
    stop_all_streams 
    conversation = Conversation.find(data['conversation_id']) 
    if conversation.is_participant?(current_user) 
     stream_from "conversation:#{data['conversation_id']}" 
    end 
    end 

    def unsubscribed 
    clear_typing 
    end 

    ... 

    def clear_typing 
    # need way to find out conversation_id of the unsubscribed stream 
    ActionCable.server.broadcast "conversation:#{data['conversation_id']}", {id: current_user.id, typing: false} 
    end 
end 

ответ

1

Я считаю, что имя класса - это название канала.

Из ActionCable документов:

# app/channels/appearance_channel.rb 
class AppearanceChannel < ApplicationCable::Channel 
    def subscribed 
    current_user.appear 
    end 

    def unsubscribed 
    current_user.disappear 
    end 

    def appear(data) 
    current_user.appear on: data['appearing_on'] 
    end 

    def away 
    current_user.away 
    end 
end 

И клиент подписывается следующим образом:

# app/assets/javascripts/cable/subscriptions/appearance.coffee 
App.cable.subscriptions.create "AppearanceChannel", 
    # Called when the subscription is ready for use on the server 
    connected: -> 
    @install() 
    @appear() 

    # Called when the WebSocket connection is closed 
    disconnected: -> 
    @uninstall() 

    # Called when the subscription is rejected by the server 
    rejected: -> 
    @uninstall() 

    appear: -> 
    # Calls `AppearanceChannel#appear(data)` on the server 
    @perform("appear", appearing_on: $("main").data("appearing-on")) 

    away: -> 
    # Calls `AppearanceChannel#away` on the server 
    @perform("away") 


    buttonSelector = "[data-behavior~=appear_away]" 

    install: -> 
    $(document).on "page:change.appearance", => 
     @appear() 

    $(document).on "click.appearance", buttonSelector, => 
     @away() 
     false 

    $(buttonSelector).show() 

    uninstall: -> 
    $(document).off(".appearance") 
    $(buttonSelector).hide() 

Если вы присмотритесь, клиент подписавшись на канал AppearanceChannel, который является именем класса.

+0

Я обновил свой вопрос, потому что я думаю, что, может быть, я не спросил совершенно правильно. Я думаю, что нашел решение тоже .. смотрел в источник для метода stop_all_streams и понял, что «потоки» были доступной переменной в ChannelClass – ethayer

1

Я думаю, что это является возможным решением, хотя было бы лучше, если бы я, если это возможно могу захватить точный отписался потока:

нашел это, посмотрев на методе stop_all_streams, так как он предупредил меня о существовании переменная 'streams'.

 
... 
    def unsubscribed 
    streams.each do |stream| 
     ActionCable.server.broadcast stream[0], {id: current_user.id, typing: false} 
    end 
    end 
...