Javascript ActionCable多次注册用户

Javascript ActionCable多次注册用户,javascript,ruby-on-rails,turbolinks,actioncable,Javascript,Ruby On Rails,Turbolinks,Actioncable,据报道,我在RoR应用程序中使用ActionCable,该应用程序被设计成角色扮演聊天室。我已经设置好了它,并且,正如预期的那样,无论何时创建,消息都会被广播。但是,每次加载聊天室页面时,都会为同一用户进行新的订阅,从而使消息出现多次。 app/assets/javascripts/channels/roleplays.咖啡: jQuery(document).on 'turbolinks:load', -> messages = $('#messages') if $('#mes

据报道,我在RoR应用程序中使用ActionCable,该应用程序被设计成角色扮演聊天室。我已经设置好了它,并且,正如预期的那样,无论何时创建,消息都会被广播。但是,每次加载聊天室页面时,都会为同一用户进行新的订阅,从而使消息出现多次。

app/assets/javascripts/channels/roleplays.咖啡:

jQuery(document).on 'turbolinks:load', ->
  messages = $('#messages')
  if $('#messages').length > 0


    App.global_chat = App.cable.subscriptions.create {
      channel: "RoleplaysChannel"
      roleplay_id: messages.data('roleplay-id')
    },
      connected: ->
# Called when the subscription is ready for use on the server

      disconnected: ->
# Called when the subscription has been terminated by the server

      received: (data) ->
        messages.append(data)
        console.log(data)


      send_message: (message, roleplay_id) ->
        @perform 'send_message', message: message, roleplay_id: roleplay_id


    $('#new_message').submit (e) ->
      $this = $(this)
      textarea = $this.find('#message_body')
      e.preventDefault()

      if $.trim(textarea.val()).length > 1
        App.global_chat.send_message textarea.val(), messages.data('roleplay-id')
        textarea.val('')

      return false

为了避免重复订阅,您需要某种方法来确定用户是否已连接

一种简单的方法可能是执行以下操作:

(->
  connected = false

  jQuery(document).on 'turbolinks:load', ->
    messages = $('#messages')

    if $('#messages').length > 0 && !connected
      App.global_chat = App.cable.subscriptions.create {
        channel: "RoleplaysChannel"
        roleplay_id: messages.data('roleplay-id')
      },
        connected: ->
          connected = true

        disconnected: ->
          connected = false

        # …
)()
这只适用于单个角色扮演(或聊天室)。如果用户尝试的角色扮演与以前访问过的角色扮演不同,则不会订阅新角色扮演。要解决此问题,您需要一种管理订阅的方法

类似以下的方法可能会起作用:

(->
  connections = []

  addConnection = (id) ->
    connections.push(id)

  removeConnection = (id) ->
    index = connections.indexOf(id)
    connections.splice(index, 1) if index > -1

  connectedTo = (id) ->
    connections.indexOf(id) > -1

  jQuery(document).on 'turbolinks:load', ->
    messages = $('#messages')
    roleplayID = messages.data('roleplay-id')

    if $('#messages').length > 0 && !connectedTo(roleplayID)
      App.global_chat = App.cable.subscriptions.create {
        channel: "RoleplaysChannel"
        roleplay_id: roleplayID
      },
        connected: ->
          addConnection(roleplayID)

        disconnected: ->
          removeConnection(roleplayID)

        # …
)()