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):'
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 #):'
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:
(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
Ich habe das selbst nicht versucht, aber es sieht so aus, als ob es funktionieren sollte.
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%Tags und Links ruby ruby-on-rails-3 ruby-on-rails actioncable