2016-07-14 6 views
1

Ich bin ein neuer Rails-Entwickler und habe angefangen, ActionCable in Rails 5 zu verwenden, um eine Chat-App zu erstellen.rails 5 - Create channel per concussion von ActionCable

Das Problem ist, dass es viele Chat-Beispiele im Internet gibt, die ActionCable verwenden, aber alle sind ziemlich einfach. Sie erstellen einen Kanal und alle Benutzer, die mit diesem Kanal verbunden sind, können die Nachrichten von anderen senden oder lesen.

Zum Beispiel erstellen sie einen Chat-Kanal wie folgt aus:

class ChatChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from 'messages' 
    end 

    def speak(data) 
    ActionCable.server.broadcast('messages', 
     message: render_message(data['message'])) 
    end 

    private 

    def render_message(message) 
    ApplicationController.render(partial: 'messages/message', 
           locals: { message: message }) 
    end 
end 

Und in der Client-Seite, sie eine Verbindung zu diesem Kanal

App.chat = App.cable.subscriptions.create "ChatChannel", 
    received: (data) -> 
    $('#messages').append(data.message) 

    speak: (msg) -> 
    @perform 'speak', message: msg 

Wie kann ich einen Kanal pro Gespräch zwischen 2 erstellen Benutzer?

Antwort

5

Die einzige Sache, die sich ändert, ist der Kanal, auf dem Sie sich anmelden. Was in diesem Fall eine bestimmte Konversation sein sollte. Man könnte so etwas wie dieses:

messages.coffee

$(document).on "turbolinks:load", -> 
    messages = $("#messages-list") 

    App.Messages = App.cable.subscriptions.create { 
    channel: "MessagesChannel" 
    # You can grab the conversation id as a data attribute from the messages container of your conversation and pass it as a parameter to the channel 
    conversation_id: messages.data("conversation-id") 
    }, 

    connected: -> 

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

    received: (data) -> 
    messages.append(data["message"]) 
    $("#new_message")[0].reset(); 

messages_channel.rb

class MessagesChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from "conversation_#{params['conversation_id']}_channel" 
    end 

    def unsubscribed 
    # Any cleanup needed when channel is unsubscribed 
    end 
end 

messages_controller.rb

# You can have something like this in your create action 
def create 
    message = @conversation.messages.build(message_params) 
    message.user = current_user 
    message.save 

    ActionCable.server.broadcast "conversation_#{message.conversation.id}_channel", 
     message: render_message(message) 

    head :ok 
end 

private 

    def set_conversation 
    @conversation = Conversation.find(params[:conversation_id]) 
    end 

    def render_message(message) 
    render partial: "messages/message", locals: { message: message } 
    end 
+0

Dank. Dies ist absolut ein Weg, den ich bereits verwendet habe, um mit diesem Problem umzugehen –

+0

Froh, dass es geholfen hat! Markieren Sie es als akzeptiert, wenn es das war, was Sie brauchten. –

+0

Ich glaube nicht, dass dies funktionieren würde, wenn Sie in der URL keine 'conversation_id' haben. Würde es Ihnen etwas ausmachen, darüber zu beraten, dass Sie das tun würden? Ich arbeite gerade daran, aber die Konversation wird auf einer Indexseite angezeigt, die alle Konversationen auflistet. Denken Sie an Messenger.com – PrimeTimeTran

Verwandte Themen