Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Verwendung von Faye als Echtzeit-Push-Server in Rails

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Katharina Nevolina (you can also view the original English article)

Es gibt mehrere Möglichkeiten, einer Anwendung eine Push-Funktionalität hinzuzufügen, einschließlich Pushr und Pub-Nub, die recht elegante und einfache Lösungen darstellen. Es gibt auch einige erweiterte Optionen. In diesem Artikel werde ich Ihnen zeigen, wie Sie Faye verwenden, ein Messaging-System, das sowohl auf Ruby als auch auf Node.js ausgeführt wird.


Schritt 1 - Bereiten Sie alles vor

Wir bauen einen einfachen Chat-Service. Ryan Bates hat dies in Railscast # 260 behandelt. In diesem Tutorial gehen wir jedoch etwas anders vor. Zuerst erstellen wir einen Chat-Service, bei dem Benutzer einen öffentlichen Raum betreten und jeder öffentlich miteinander chatten kann. Die zweite Funktionalität, die wir hinzufügen werden, sind private Nachrichten. Darüber hinaus integrieren wir einige Sicherheitsaspekte in unsere Implementierung, indem wir das private_pub gem von Ryan Bate verwenden.

Stellen Sie sicher, dass Sie über ein funktionierendes Setup von Ruby und Ruby on Rails 3.1 verfügen. Abgesehen davon brauchen Sie thin. Thin ist ein weit verbreiteter Ruby-Webserver, für den Faye erforderlich ist (funktioniert nicht mit dem eingebauten WEBrick-Server von Rails). Sie können Thin wie folgt installieren:

Wir sollten fertig sein, also erstellen wir die Anwendung:

Nun fügen Sie den faye gem zu Ihrem Gemfile hinzu:

und führen Sie das bundle install aus, um es zu installieren. Faye muss auf einem separaten Webserver von der Webanwendung selbst ausgeführt werden. Um das zu erreichen, müssen Sie eine Rackup-Konfigurationsdatei erstellen. Fügen Sie eine faye.ru-Datei zum Stamm des Projekts hinzu und stellen Sie sicher, dass es so aussieht:

Diese Datei teilt Rackup lediglich mit, wie der Faye-Server gestartet wird. Probieren Sie es aus, um sicherzustellen, dass es richtig funktioniert. Führen Sie dies in Ihrem Terminal aus:

Wenn Sie keine Fehler erhalten, können Sie loslegen!


Schritt 2 - Einige grundlegende Authentifizierung

Um eine Chat-Anwendung zu erstellen, benötigen wir zwei grundlegende Dinge: Benutzer und einen Chatroom. Wir werden unsere Benutzer nicht authentifizieren, aber wir müssen ihnen trotzdem die Möglichkeit geben, ihren Benutzernamen festzulegen. Lassen Sie uns das schaffen. Führen Sie den folgenden Befehl aus, um einen Sitzung-controller zu erstellen, damit wir ihn anmelden können:

Dadurch werden ein Session-controller und zwei Methoden erstellt: new und create. Fügen Sie diese Routen zu Ihrer Datei routes.rb hinzu:

Diese beiden Routen sollten für Sie selbsterklärend sein. Fahren Sie fort und ändern Sie die Datei app/views/sessions/new.html.erb:

Und die create-Methode im Session-controller sieht folgendermaßen aus:

Probieren Sie es aus! Führen Sie den rails-server im Terminal aus und rufen Sie localhost:3000/login auf, und geben Sie einen Benutzernamen ein. Sie sollten von Ihrer Bewerbung begrüßt werden, nachdem Sie das Formular abgeschickt haben.

Wenn Sie sich einer Herausforderung stellen, können Sie Omniauth verwenden, um für diesen Schritt eine Integration mit Twitter oder Facebook hinzuzufügen!


Schritt 3 - Der Chatroom

Nun, da wir über einige grundlegende Authentifizierung verfügen, fügen wir einen Chatroom hinzu. Führen Sie den folgenden Befehl aus, um einen Chat-Controller zu erstellen:

Dies generiert unseren Chat-Controller und eine room-Methode. Wir müssen einige Routen hinzufügen, damit unser Chat funktioniert. Fügen Sie also diese Zeile zu Ihrer Datei routes.rb hinzu:

Diese Route leitet unseren Benutzer in den Chatroom und lässt ihn über ein einfaches Formular Nachrichten veröffentlichen. Ändern Sie die room-Methode auf dem Chats-Controller und machen Sie es so:

Dadurch wird sichergestellt, dass Benutzer einen Benutzernamen festlegen, wenn sie chatten möchten. Nun lassen Sie uns den Raum selbst erstellen! Fügen Sie das der app/views/chats/room.html.erb hinzu:

Dies ist eine einfache Struktur für room. Das Formular am Ende wird von einem JavaScript-Code verwaltet, der die Nachricht im Chatroom veröffentlicht.

Um Nachrichten in den Raum zu senden, müssen wir unserer Ansicht JavaScript hinzufügen. Fügen Sie zunächst Fayes Bibliothek zu app/views/layouts/application.html.erb hinzu:

Fügen Sie dann am Anfang der Ansicht room.html.erb Folgendes hinzu:

Diese Methode übernimmt die Nachricht in der Form, die wir zuvor hinzugefügt haben (wenn sie übermittelt wurde) und sendet den Benutzernamen und die Nachricht des Autors an den Kanal "/messages/public" in einem JSON-Objekt. Kanale sind die Art und Weise, wie Faye Nachrichten sendet. Ein Benutzer abonniert einen Kanal und empfängt alle Nachrichten, die an ihn gesendet werden. In unserem Fall gibt es nur einen Kanal, den öffentlichen. Lassen Sie uns den Code noch etwas genauer analysieren:

  1. Zuerst instanziieren wir einen neuen Faye-Client und lassen ihn mit unserem Faye-Server verbinden.
  2. Als Nächstes kümmern wir uns um die Übermittlung des Formulars. Wenn der Benutzer die Eingabetaste drückt oder auf "Senden" klickt, veröffentlichen wir das oben genannte JSON-Objekt, das den Absender der Nachricht und die Nachricht selbst enthält, im öffentlichen Kanal.
  3. Anschließend löschen wir das Meldungsfeld und geben return false, um zu verhindern, dass das Formular tatsächlich gesendet wird und die Seite aktualisiert wird.

Nun werden Nachrichten im Chatroom veröffentlicht, aber die verbundenen Benutzer können sie nicht empfangen, da ihre Browser den Kanal nicht abonniert haben. Das wird durch etwas mehr JavaScript erreicht. Der JavaScript-Block für app/views/chats/room.html.erb sollte folgendermaßen aussehen:

Dadurch wird einfach eine Verbindung mit dem Server von Faye hergestellt und der Kanal „/messages/public“ abonniert. Der von uns bereitgestellte Rückruf empfängt die gesendeten Nachrichten. data ist das JSON-Objekt, das wir zuvor veröffentlicht haben, markieren Sie die

darin enthaltene Nachricht und hängen Sie sie an den Chatroom-Container an.

Sie sollten jetzt einen einfachen Chat haben! Führen Sie sowohl Faye als auch den Rails-Server aus, und öffnen Sie zwei Browser (oder beispielsweise ein Inkognito-Fenster in Chrome). Sie können zwei verschiedene Benutzernamen eingeben und Ihren Chat testen. Nachrichten sollten fast sofort im Chatroom angezeigt werden, sobald Sie sie senden.


Schritt 4 - Private Nachrichten hinzufügen

Im Moment können Benutzer miteinander chatten, aber alle Nachrichten sind öffentlich. Fügen Sie einige einfache Funktionen hinzu, mit denen Personen private Nachrichten senden können, indem Sie den Benutzernamen des Empfängers angeben - wie in Twitter. Damit das funktioniert, abonnieren wir unsere Benutzer in ihren eigenen Kanälen, sodass sie die einzigen sind, die Nachrichten davon empfangen können. Machen Sie Ihre app/views/chats/room.html.erb JavaScript so aussehen:

Wie Sie sehen, haben wir zwei Faye-Kanäle abonniert: Einer ist der öffentliche und der zweite ist ein Kanal mit dem Namen "/messages/private/USERNAME" (beachten Sie, dass wir den Benutzernamen in der Rails-Sitzung verwenden). Auf diese Weise senden wir, wenn jemand diesen Benutzer erwähnt, die Nachricht nicht über den öffentlichen Kanal, sondern über den privaten Kanal des Empfängers, sodass nur diese Person sie lesen kann. Wir fügen auch einige einfache Stile hinzu, sodass sie fett dargestellt werden.

Eine andere Sache, die geändert wurde, ist der Code, der Nachrichten veröffentlicht. Wir prüfen zunächst, ob es sich um eine private Nachricht handelt, indem Sie einen einfachen regulären Ausdruck anwenden, der nach einer Erwähnung sucht. Ist das der Fall, veröffentlichen wir eine Nachricht an den spezifischen Kanal des Empfängers. Wenn nicht, machen wir genau so wie zuvor - veröffentlichen es im öffentlichen Kanal.

Jetzt probieren Sie es aus! Senden Sie Nachrichten an andere Benutzer, indem Sie sie erwähnen. Sie sollten sie nur im Chatfenster des Empfängers sehen.


Schritt 5 - Einige Vorsichtsmaßnahmen

Diese Implementierung hat ihre Mängel. Erstens prüfen wir nicht, ob der Benutzername, den eine Person wählt, bereits verwendet wird. Das würde bedeuten, dass jeder denselben Benutzernamen wie jemand anderes eingeben und Nachrichten senden kann, die sich als sie selbst ausgeben, und sogar seine privaten Nachrichten erhalten! Dies kann leicht durch Hinzufügen eines Authentifizierungssystems oder durch Speichern der aktuell verwendeten Benutzernamen in einer Datenbank gelöst werden. Ich werde das im heutigen Tutorial nicht behandeln, aber es sollte ziemlich einfach für Sie sein, es zu implementieren. Wenn Sie Hilfe benötigen, hinterlassen Sie einen Kommentar, und wir helfen Ihnen dabei!

Der zweite Vorbehalt ist nicht so offensichtlich. Das Problem bei unserer Implementierung ist, dass jeder das JavaScript im Handumdrehen manipulieren kann (z. B. mit Firebug), um sich selbst bei jedem gewünschten Kanal (auch bei privaten Kanälen) zu abonnieren und ihm Nachrichten zu veröffentlichen, die sich als jemand anderes ausgeben. Das ist nicht so leicht zu lösen wie der erste Fehler, auf den ich hingewiesen habe (wenn wir das Problem manuell lösen würden), aber Ryan Bates hat ein Juwel geschaffen, das diese Aufgabe zum Kinderspiel macht und unsere App sehr sicher macht.

Der Edelstein heißt private_pub. Es verbietet im Wesentlichen jedem Benutzer die Veröffentlichung auf Kanälen mit JavaScript, was bedeutet, dass nur die Rails-App für ihn veröffentlichen kann. Das erhöht die Sicherheit, da ein böswilliger Benutzer nicht in privaten Kanälen veröffentlichen kann. Eine andere Sache, die dieser Edelstein löst, sind Abonnements. Mit private_pub kann ein Benutzer nur Nachrichten von Kanälen empfangen, in denen wir sie abonniert haben, sodass er kein Abonnement manuell hinzufügen kann, wodurch das gesamte Problem gelöst wird.

Also fügen wir es unserer Gemfile hinzu:

Führen Sie die bundle install aus, um den Edelstein zu installieren, und führen Sie den Generator aus, um die Konfigurationsdateien zu erstellen:

Wenn Sie diesen Befehl ausführen, erhalten Sie eine Konfliktwarnung (private_pub versucht, die Datei faye.ru zu überschreiben). Geben Sie einfach "Y" ein und drücken Sie die Eingabetaste, da diese Datei überschrieben werden muss. Sie müssen auch die Datei public/private_pub.js in den Ordner app/assets/javascripts verschieben. Und das Letzte: Entfernen Sie die Zeile, die faye.js in application.html.erb enthält, da Private Pub diese automatisch enthält. Stellen Sie sicher, dass Sie an diesem Punkt beide Server (Rails und Faye) neu starten.

Nun müssen wir einige Änderungen vornehmen. Erstens: Das Abonnieren eines Benutzers für einen Kanal erfolgt mit private_pub anders. Bearbeiten Sie app/views/chats/room.html.erb und fügen Sie vor dem JavaScript-Block Folgendes hinzu:

Das ist eine Methode von private_pub, Kanäle zu abonnieren. Dadurch kann der Benutzer Nachrichten über den von Ihnen angegebenen Kanal empfangen. Nun müssen wir den JavaScript-Code wie folgt ändern:

PrivatePub.subscribe ("/messages/public", Funktion (Daten) {
$ ('<p></p>'). html (data.username + ":" + data.msg) .appendTo ('#chat_room');
});

PrivatePub.subscribe ("/messages/private/<% =session[:username]%>"), function(data) {
$ ('<p></p>'). addClass ('private'). html (data.username + ":" + data.msg) .appendTo ('# chat_room');
});

Der einzige Unterschied besteht darin, dass wir PrivatePub verwenden, um Channels anstelle der Faye-Bibliothek direkt zu abonnieren.

Wir müssen auch die Art und Weise ändern, in der wir Nachrichten veröffentlichen. Mit Private Pub kann nur die Rails-Anwendung Nachrichten veröffentlichen. Die Javascript-Bibliothek kann keine eigenen Nachrichten veröffentlichen. Das ist eine gute Sache, da wir die volle Kontrolle darüber haben, wer Nachrichten auf welchem Kanal veröffentlicht. Dazu müssen Sie das Formular zum Senden von Nachrichten folgendermaßen ändern:

Das ist ein AJAX-Formular, daher wird die Seite beim Senden nicht aktualisiert. Es wird auch nach new_message_path gesucht. Fügen Sie dies also zu routes.rb hinzu:

Sie müssen auch eine neue Methode auf dem Chat-Controller erstellen:

Dies funktioniert ähnlich wie sein JavaScript-Pendant. Es bestimmt, ob die Nachricht eine Erwähnung enthält, und sendet die Nachricht an den privaten Kanal des Empfängers. Wenn nicht, wird die Nachricht über den öffentlichen Kanal gesendet. Nun wird die Nachricht nicht wirklich gesendet, sondern es werden nur zwei Variablen erstellt, die wir aus der Sicht verwenden müssen, um eine zu senden. In Private Pub können Sie keine Nachrichten über den controller senden (zumindest nicht mit der für dieses Lernprogramm verwendeten Version). Erstellen Sie dann die Datei app/views/chats/new_message.js.erb und fügen Sie Folgendes hinzu:

Dadurch wird die erste Codezeile ausgeführt, wobei das Meldungsfeld gelöscht wird. Wenn Sie publish_to aufrufen, sendet Private Pub @message (die bei Ankunft in ein JSON-Objekt konvertiert wird) an @channel. Einfach, oder?

Probieren Sie es aus. Es sollte wie zuvor funktionieren, nur mit neuer zusätzlicher Sicherheit!


Schlussfolgerung

Ich hoffe, dieser Artikel gibt Ihnen einen Einblick in die Verwendung von Faye für Ihre Projekte. Ich würde empfehlen, dass Sie immer Private Pub verwenden, da dies eine wichtige Sicherheitsstufe darstellt, es sei denn, Sie benötigen es nicht wirklich.

Wenn Sie Fragen haben, können Sie diese gerne in den Kommentaren stellen oder mir einen Tweet senden!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.