2016-04-28 4 views
3

Ich habe einen einfachen Chat mit Rails 5 und ActionCable aufgebaut, wo ich einen einfachen "Chat" -Kanal habe.ActionCable: Wie man dynamische Kanäle benutzt

Wie kann ich das Kanalabonnement und die Nachrichtenübertragung dynamisch machen, damit ich Chatkanäle erstellen und die Nachrichten an die richtigen Kanäle senden kann?

Ich kann leider kein einziges Codebeispiel finden.

aktualisieren

Die Antwort unten ist richtig. Ich habe es auch jetzt im Schienenführer erwähnt. Glauben Sie nicht, es gibt vor http://edgeguides.rubyonrails.org/action_cable_overview.html#client-server-interactions-subscriptions

Antwort

9

eine roomId in javascripts/channels/room.js auf Ihrem Abonnement Schaffung Pass ist:

MakeMessageChannel = function(roomId) { 
    // Create the new room channel subscription 
    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 
     }); 
    } 
    }); 

    $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) { 
    if (event.keyCode === 13) { 
     App.room.speak(event.target.value, roomId); 
     event.target.value = ""; 
     event.preventDefault(); 
    } 
    return $('#messages').animate({ 
     scrollTop: $('#messages')[0].scrollHeight 
    }, 100); 
    }); 
}; 

In channels/room_channel.rb es als Parameter für das Abonnement Erstellung verfügbar wird, und die spricht Aktion war auch nur mit den richtigen Daten genannt:

def subscribed 
    stream_from "room_channel_#{params[:roomId]}" 
    end 

    def speak(data) 
    Message.create! text: data['message'], room_id: data['roomId'] 
    end 

Und dann, wenn Sie von einem Job sind Rundfunk:

def perform(message) 
    ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message) 
    end 
+0

genial danke werde es heute Abend versuchen –

+1

Wie funktioniert das, wenn Sie mehrere Chatrooms haben? Wie abonniere man roomA und roomB und autorisiere sie auf dem Server, basierend darauf, ob ein Benutzer Zugang zu einem Raum hat, mit Ihrem Beispiel? –

+0

dann wie @ room.id vom Controller an room.js übergeben? – icemelt