2017-10-09 1 views
3

Sitepoint's tutorial에 따라 롤 플레이를위한 대화방으로 작동하도록 설계된 RoR 응용 프로그램에서 ActionCable을 사용하고 있습니다. 나는 그것을 설정했고, 메시지가 생성 될 때마다 예상대로 메시지가 방송됩니다. 그러나 대화방 페이지가로드 될 때마다 동일한 사용자에 대한 새로운 구독이 만들어 지므로 메시지가 여러 번 나타납니다./roleplays.coffee
ActionCable은 여러 번 사용자를 등록합니다

응용 프로그램/자산/자바 스크립트/채널 :

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 

답변

1

중복 가입을 방지하기 위해, 당신은 사용자가 이미 연결되어 있는지 여부를 결정하는 방법이 필요합니다.

간단한 방법은 다음과 같이 뭔가를 할 수 있습니다 :

(-> 
    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) 

     # … 
)() 
관련 문제