Wie kann ich eine Kanalmethode in einem Schienen-Controller aufrufen?

9

Ich habe eine ActionCable-Methode, die den Benutzer abonniert. Wenn ein neues Convo gestartet wird, möchte ich den Benutzer auch für den neuen Kanal anmelden. Ich kann die richtige Syntax für den Aufruf einer Kanalmethode in einem Controller nicht herausfinden.

UPDATE: Das Problem ist, dass die Nachrichten beim Senden an die Chatbox angehängt werden, aber wenn die erste Nachricht gesendet wird, ist die Websocket-Verbindung noch nicht eingerichtet und daher sieht der Benutzer so aus, als ob die Nachricht nicht gesendet wurde (weil es nicht angehängt wird).

channel / msgs_channel.rb

%Vor%

In meiner convos controller, Methode erstellen, habe ich verschiedene Dinge ausprobiert:

convos_controller.rb

%Vor%

ActionCable.subscribe(@convo.id)

Fehler: NoMethodError (undefined method subscribe 'für ActionCable: Modul)'

ActionCable.msgs.subscribe(@convo.id)

Fehler: NoMethodError (undefined method msgs 'für ActionCable: Modul):'

%Vor%

Fehler: NameError (uninitialized constant ConvosController::App):

MsgsChannel.subscribe(@convo.id)

Fehler: NoMethodError (undefined method subscribe 'für MsgsChannel: Klasse'

ActionCable.server.subscribe(@convo.id)

Fehler: NoMethodError (undefined method subscribe 'für #):'

    
gwalshington 08.03.2017, 19:01
quelle

2 Antworten

3

Abrufen einer bestimmten Kanalinstanz von einem Controller

Channel Instanzen sind dem Connection des Benutzers zugeordnet. Folgendes funktioniert, um einen Hash von Channel s für Connection zu erhalten:

%Vor%

(Wenn Connection#current_user nicht existiert, folgen Sie den Anweisungen oben in Abschnitt 3.1.1 von den Schienen ActionCable-Übersicht , um es hinzuzufügen.)

Sie können dann Channel basierend auf den von Ihnen gewünschten Kriterien erhalten. Zum Beispiel könnten Sie nach Typ suchen, was in Ihrem Fall MsgsChannel wäre. Der JSON-Schlüssel in subs könnte ebenfalls verwendet werden, könnte aber komplizierter sein.

Sobald Sie diese Instanz haben, können Sie dann die gewünschte Methode aufrufen (in Ihrem Fall MsgsChannel#subscribe ).

Bedenken bezüglich dieses Ansatzes

A Channel kapselt nur serverseitige Arbeit ein, die als Reaktion auf Nachrichten von der Client-Seite der App ausgelöst wird. Wenn der Server eine Channel -Methode aufruft, bedeutet dies, dass der Server vorgibt, dass ein Konsument eine Nachricht gesendet hat, die er nicht gesendet hat.

Ich würde empfehlen, anstatt dies zu tun, die Logik, die Sie verwenden möchten, sowohl von Controller als auch von Channel in eine Methode an einem freigegebenen Speicherort zu setzen. Die Controller und Channel können diese Methode dann direkt nach Bedarf aufrufen.

Vor diesem Hintergrund gibt es eine schmerzliche Einschränkung, nämlich dass Sie Channel benötigen, um stream_from zu nennen. Leider ist das Verwalten von Streams für Channel s spezifisch, obwohl es im Grunde nur Pubsub-Informationen für Server aktualisiert.

Ich denke, dass das Stream-Management wirklich nur die entsprechende Verbindung und das Server mit seinem Pubsub erfordern sollte. Wenn dies der Fall wäre, müssten Sie sich nicht darum kümmern, Channel Methoden von der Serverseite einer Anwendung aus aufzurufen.

Sie sollten stream_for effektiver direkt ausführen können, wenn Sie eine Channel , eine beliebige Channel erhalten (Sie könnten auch subs von oben verwenden) und rufen Sie stream_for darauf auf

%Vor%

Ich habe das selbst nicht versucht, aber es sieht so aus, als ob es funktionieren sollte.

    
Chiune Sugihara 13.04.2017 03:11
quelle
1

Sie sollten den Benutzer also nicht auf dem Kanal im Controller bei create registrieren. Es sollte darauf basieren, wenn sie die Seite besuchen. Sie sollten ändern, wo Benutzer verbunden sind, indem Sie eine js / coffe-Datei hinzufügen, um dies für Sie zu tun, basierend darauf, wer verbunden ist. Ein gutes Beispiel / Tutorial dafür, als ich gelernt wurde, war dieses Video hier .

Was das Video auslässt, ist, wie man sich mit einer einzelnen Konversation verbindet. Also habe ich damit gekämpft und einen Weg gefunden, die Konversations-ID aus der URL zu holen, wahrscheinlich nicht der beste Weg, aber es funktioniert. Hoffe das hilft

%Vor%     
Tall Paul 09.03.2017 13:19
quelle