How to close connection in Action cable?

后端 未结 5 481
时光取名叫无心
时光取名叫无心 2021-01-12 10:59

How to disconnect a client in Action cable (rails 5)? I would like the user to be completely disconnected (similar to when he closes the tab).

相关标签:
5条回答
  • 2021-01-12 11:26

    to disconnect from the client side (in js), call

    App.cable.disconnect();
    

    to disconnect from the server side - see the answer from @prograils

    0 讨论(0)
  • 2021-01-12 11:39

    My work around was to create a new route just for disconnect.

    def disconnection
        ActionCable.server.remote_connections.where(connected_user: user_params['email']).disconnect
    
       render json: {}, status: 200 
    end
    

    The client side would have to call the endpoint... something like

    PUT  /api/cable/disconnection
    
    0 讨论(0)
  • 2021-01-12 11:46

    Disconnecting a client from your rails application

    If you want to disconnect a client from the rails application, use the disconnect method as described in the documentation: https://api.rubyonrails.org/classes/ActionCable/RemoteConnections.html

    module ApplicationCable
      class Connection < ActionCable::Connection::Base
        identified_by :current_user
        ....
      end
    end
    
    ActionCable.server.remote_connections.where(current_user: User.find(1)).disconnect
    

    Disconnecting from the client side

    If you want to disconnect the user from the client side you can use the disconnect and unsubscribe functions in your javascript:

    App.cable = ActionCable.createConsumer(...)
    
    // Closes the websocket connection.
    App.cable.disconnect();
    
    // Unsubscribe from a actioncable subscription (without disconnecting the websocket connection)
    App.example = App.cable.subscriptions.create(..);
    App.example.unsubscribe();
    
    0 讨论(0)
  • 2021-01-12 11:46

    I found this inside /var/lib/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/remote_connections.rb

    If you need to disconnect a given connection, you can go through the RemoteConnections. You can find the connections you're looking for by searching for the identifier declared on the connection. For example:

    module ApplicationCable
      class Connection < ActionCable::Connection::Base
        identified_by :current_user
        ....
      end
    end
    
    ActionCable.server.remote_connections.where(current_user: User.find(1)).disconnect
    

    This will disconnect all the connections established for
    User.find(1), across all servers running on all machines, because it uses the internal channel that all of these servers are subscribed to.

    Hope this will be useful. Looks like it works even in Rails console.

    0 讨论(0)
  • 2021-01-12 11:47

    Disconnecting from the client

    I stumbled across this issue too. But I could not believe that there is no simple way to disconnect the websocket connection from the client (without doing an API call). Luckily this works for me:

    // Create consumer
    window.cable = ActionCable.createConsumer(...)
    
    // Subscribe to channels
    window.cable.subscriptions.create('SomeChannel', ...);
    
    // At some point we want to disconnect (e.g. when user logs out)
    window.cable.subscriptions.consumer.disconnect();
    
    0 讨论(0)
提交回复
热议问题