How do you remove an actioncable channel subscription in Rails 5 with App.cable.subscriptions.remove?
Asked Answered
M

3

8

To create subscriptions I run:

  App.room = App.cable.subscriptions.create({
    channel: "RoomChannel",
    roomId: roomId
  }, {
    connected: function() {},
    disconnected: function() {},
    received: function(data) {
      return $('#messages').append(data['message']);
    },
    speak: function(message, roomId) {
      return this.perform('speak', {
        message: message,
        roomId: roomId
      });
    }
  });

But because I want the client to never be subscribed to more than one channel, what can I run each time before this to remove all subscriptions the client has?

I tried to do something super hacky like:

App.cable.subscriptions['subscriptions'] = [App.cable.subscriptions['subscriptions'][1, 0]]

But I'm sure it didn't work because there are many other components that go into a subscription/unsubscription.

App.cable.subscriptions.remove requires a subscription argument, but what do I pass in?

Thanks!

Metabolism answered 1/5, 2016 at 7:21 Comment(0)
C
9

A bit of a late answer, but considering you've already declared

App.room = App.cable.subscriptions.create(...)

to remove, something like

if (App.room) App.cable.subscriptions.remove(App.room);

should suffice.

Catamenia answered 10/2, 2017 at 18:49 Comment(0)
M
3

Running this before each subscription creation will ensure there is only ever a maximum of one subscription per client.

if (App.cable.subscriptions['subscriptions'].length > 1) {
    App.cable.subscriptions.remove(App.cable.subscriptions['subscriptions'][1])
};
Metabolism answered 2/5, 2016 at 5:43 Comment(0)
L
2

It looks like you would need to create a reference to your subscription on create

let mySubscription = App.cable.subscriptions.create({
  channel: "MyChannel"
},
{
  connected: () => { console.log('connected') },
  disconnected: () => {},
  received: (data) => {}
});

and then remove it like so

App.cable.subscriptions.remove(mySubscription)
Lyrate answered 12/9, 2016 at 18:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.