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

Wie kann man ein unauffälliges Anmeldesystem in Rails erstellen?

by
Length:LongLanguages:

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

Ein unauffälliges Anmeldesystem ist eines, das dem Benutzer aus dem Weg geht. Dadurch wird Ihre Anwendung schöner und ausgefeilter. Dieser Artikel führt Sie durch den Prozess des Einrichtens von Benutzeranmeldungen und anschließendem Bestätigen des Prozesses, indem Sie das Formular in eine modale Box verschieben, die mit dem Server kommuniziert. Darüber hinaus zeigt Ihnen dieser Artikel, wie Sie das Setup mit jQuery und Prototype erstellen, damit Sie Ihre Lieblingsbibliothek auswählen können. In diesem Artikel wird davon ausgegangen, dass Sie Erfahrung mit Rails und jQuery oder Prototype haben.


Sie können Adman65/nettuts für eine erfolgreiche Anmeldung verwenden. Stellen Sie sicher, dass Sie schlechte Anmeldeinformationen verwenden, damit Sie sehen können, wie alles funktioniert.

Was machen wir?


Final Project

Anfangen

Zunächst erstellen wir eine Dummy-Anwendung mit einer öffentlichen und einer privaten Seite. Die Root-URL ist die öffentliche Seite. Auf der öffentlichen Seite befindet sich ein Anmeldelink. Wenn sich der Benutzer erfolgreich anmeldet, wird er auf die private Seite umgeleitet. Wenn nicht, werden sie zurück zum Anmeldeformular weitergeleitet. Die private Seite zeigt den Benutzernamen. Wir werden dies als Ausgangspunkt für die Ajaxifizierung der Website verwenden.

Der erste Schritt besteht darin, mit dem Befehl Rails eine neue Anwendung zu generieren und dann authlogic zu installieren und einzurichten.

authlogic hinzufügen.

Installieren Sie nun die gems.

Erstellen Sie als Nächstes ein Benutzermodell und fügen Sie der Migration die erforderlichen authlogischen Spalten hinzu.

Fügen Sie nun die Spalten zur neuen Migration hinzu.

Migrieren Sie die Datenbank.

Authlogic in das Benutzermodell aufnehmen.

Jetzt können wir einen Benutzer erstellen. Da es sich um eine Demo-App handelt, sind keine webbasierten Funktionen zum Anmelden erforderlich. Öffnen Sie also die Konsole und erstellen Sie einen Benutzer:

Jetzt haben wir einen Benutzer im System, aber wir haben keine Möglichkeit, uns anzumelden oder abzumelden. Dazu müssen wir die Modelle, Controller und Ansichten erstellen. Authlogic hat eine eigene Klasse zum Verfolgen von Anmeldungen. Wir können den Generator dafür verwenden:

Als nächstes müssen wir den Controller generieren, der Benutzer an- und abmeldet. Sie können Sitzungen wie jede andere Ressource in Rails erstellen.

Stellen Sie nun den Inhalt auf:

Es sieht genauso aus wie ein Controller, der über ein Gerüst generiert wurde. Erstellen Sie nun den Benutzer-Controller mit öffentlichen und privaten Inhalten. Generieren Sie einen Benutzer-Controller. Innerhalb des Controllers verwenden wir einen Vorher-Filter, um den Zugriff auf die privaten Bereiche zu beschränken. Die Indexaktion ist öffentlich und die Show ist privat.

Aktualisieren Sie den Inhalt:

Sie sollten beachten, dass current_user an dieser Stelle eine undefinierte Methode ist. Definieren Sie diese Methoden in ApplicationController. Öffnen Sie application_controller.rb und aktualisieren Sie den Inhalt:

Zu diesem Zeitpunkt sind die Modelle und Steuerungen vollständig, die Ansichten jedoch nicht. Wir müssen Ansichten für ein Anmeldeformular und den öffentlichen und privaten Inhalt erstellen. Wir werden gem der raffinierten Generatoren verwenden, um ein grundlegendes Layout zu erstellen.

Zeit, um das Anmeldeformular zu erstellen. Wir werden hierfür einen Teil verwenden, da wir in Zukunft den Teil verwenden werden, um nur das Anmeldeformular im modalen Feld zu rendern. Hier ist der Code zum Erstellen des Anmeldeformulars. Es ist genau so, als würden Sie einen Blog-Beitrag oder ein anderes Modell erstellen.

Rendern Sie den Teil in der neuen Ansicht:

Erstellen Sie einige grundlegende Seiten für den öffentlichen und privaten Inhalt. Die Indexaktion zeigt öffentlichen Inhalt und show zeigt privaten Inhalt an.

Und für die private Seite:

Löschen Sie die Datei /public/index.html und starten Sie den Server. Sie können sich jetzt bei der Anwendung an- und abmelden.

Hier sind einige Screenshots der Demo-Anwendung. Die erste ist die öffentliche Seite.

Public Page

Nun das Anmeldeformular

Login Page

Und die private Seite

Private Page

Und schließlich wird der Zugriff verweigert, wenn Sie versuchen, http://localhost:3000/user zu besuchen

Access Denied

Der AJAX-Anmeldevorgang

Bevor wir fortfahren, müssen wir verstehen, wie Server und Browser zusammenarbeiten, um diesen Prozess abzuschließen. Wir wissen, dass wir JavaScript für die Modalbox und den Server verwenden müssen, um die Anmeldungen zu überprüfen. Lassen Sie uns klarstellen, wie dies funktionieren wird. Der Benutzer klickt auf den Anmeldelink. Anschließend wird ein modales Feld mit dem Anmeldeformular angezeigt. Der Benutzer füllt das Formular aus und wird entweder auf die private Seite umgeleitet oder das modale Feld wird mit einem neuen Anmeldeformular aktualisiert. Die nächste Frage ist, wie Sie die Modalbox aktualisieren oder dem Browser mitteilen, was zu tun ist, nachdem der Benutzer das Formular gesendet hat. Rails hat reply_to-Blöcke. Mit reply_to können Sie den Controller anweisen, unterschiedliche Inhalte zu rendern, wenn der Benutzer XML, HTML, JavaScript, YAML usw. angefordert hat. Wenn der Benutzer das Formular sendet, kann der Server JavaScript zurückgeben, um es im Browser auszuführen. Wir verwenden dieses Rendering für ein neues Formular oder eine Weiterleitung. Bevor wir tiefer tauchen, gehen wir den Vorgang der Reihe nach durch.

  1. Benutzer geht zur öffentlichen Seite
  2. Der Benutzer klickt auf den Anmeldelink
  3. Das modale Feld wird angezeigt
  4. Der Benutzer füllt das Formular aus
  5. Das Formular wird an den Server gesendet
  6. Der Server gibt JavaScript zur Ausführung zurück
  7. Der Browser führt das JavaScript aus, das die Modalbox entweder umleitet oder aktualisiert.

Das ist das hohe Niveau. Hier ist die Implementierung auf niedriger Ebene.

  1. Benutzer besucht die öffentliche Seite
  2. Die öffentliche Seite enthält JavaScript, das ausgeführt wird, wenn das DOM bereit ist, das JavaScript an den Anmeldelink anfügt. Dieses Javscript führt eine XMLHTTPRequest (XHR von nun an) an den Server für etwas JavaScript durch. Das JavaScript setzt den Inhalt der Modalbox auf das Formular HTML. Das JavaScript macht auch etwas sehr Wichtiges. Es bindet die Übermittlungsaktion des Formulars an eine XHR mit POST-Daten an die Aktion des Formulars. Auf diese Weise kann der Benutzer das Anmeldeformular weiterhin in der Modalbox ausfüllen.
  3. Die Modal Box hat jetzt das Formular und das erforderliche JavaScript
  4. Der Benutzer klickt auf "Anmelden".
  5. Die Funktion submit() wird aufgerufen, die einen POST XHR für die Aktion des Formulars mit seinen Daten ausführt.
  6. Der Server generiert entweder das JavaScript für das Formular oder die Umleitung
  7. Der Browser empfängt das JavaScript und führt es aus. Der Browser aktualisiert entweder die modale Box oder leitet den Benutzer über window.location weiter.

Am AJAX Ready Controller einen Peak nehmen

Schauen wir uns die neue Struktur für den UserSessions-Controller an.

Wie Sie sehen können, ist die Struktur anders. Innerhalb von if save, else bedingt, wird reply_to verwendet, um den richtigen Inhalt zu rendern. want.xx wobei xx ein Inhaltstyp ist. Standardmäßig fordern Prototype und jQuery Text/JavaScript an. Dies entspricht wants.js. Wir sind kurz davor, mit dem AJAX-Teil zu beginnen. Wir werden keine Plugins außer denen für Modalboxen verwenden. Wir verwenden Facebox für jQuery und ModalBox für Prototype.

Prototyp

Rails hat Unterstützung für Prototype eingebaut. Die JavaScript-Helfer von Rail sind Ruby-Funktionen, die JavaScript generieren und Prototype verwenden. Diese Technik ist als RJS (Ruby JavaScript) bekannt. Ein Beispiel ist remote_form_for, das wie der Standard for_for funktioniert und einige an onsubmit gebundene JS hinzufügt, die das Formular unter Verwendung seiner Methode mit seinen Daten an seine Aktion senden. Ich werde in diesem Artikel kein RJS verwenden, da ich Vanilla JS demonstrieren möchte. Ich denke, durch die Verwendung von reinem JS und die Eliminierung der JS-Helfer wird der Artikel für weniger erfahrene Entwickler zugänglicher. Abgesehen davon können Sie diese Schritte problemlos mit RJS/Prototype-Helfern ausführen, wenn Sie dies wünschen.

Das Hinzufügen eines Prototyps zur Anwendung ist sehr einfach. Wenn Sie den Befehl Rails verwenden, werden der Prototyp und die scriptaculous-Dateien in/public/JavaScripts erstellt. Sie einzuschließen ist einfach. Öffnen Sie /app/views/layouts/application.erb und fügen Sie diese Zeile in das Head-Tag ein:

JavaScript_include_tag erstellt Skript-Tags für Standarddateien in/public/JavaScripts, vor allem prototype.js, effects.js und application.js. effects.js ist scriptaculous. application.js ist eine Datei, mit der Sie anwendungsspezifisches JS behalten können. Jetzt brauchen wir ein Modal Box Plugin. Wir werden dies nutzen. Es ist ein sehr schönes Modal Box Plugin, das von OSX inspiriert ist. Die Quelle wird auf GitHub gehostet, daher müssen Sie die Dateien in Ihrem Projektverzeichnis klonen und verschieben. Zum Beispiel:

Fügen Sie nun die Stylesheets und JavaScript in Ihre Anwendung ein.

Lassen Sie uns jetzt unseren Login-Link öffnen, um eine Modalbox zu öffnen. Dazu müssen wir JavaScript hinzufügen, das ausgeführt wird, wenn das DOM bereit ist, das die Modalbox an unseren Link anfügt. Wenn der Benutzer auf den Anmeldelink klickt, führt der Browser ein GET zu/user_sessions/new durch, das das Anmeldeformular enthält. Der Login-Link verwendet den Selektor #Login-Link. Aktualisieren Sie den Anmeldelink, um die neue ID in /app/views/users/index.html.erb zu verwenden. Ändern Sie die Funktion link_to folgendermaßen:

Das gibt uns einen #Login-Link. Nun soll das JavaScript eine Modalbox anhängen. Fügen Sie diese JS in /public/JavaScripts/application.js hinzu

Es gibt einige einfache JS, wenn der Benutzer auf den Link klickt, wird ein modales Feld mit der href des Links geöffnet. Weitere Informationen finden Sie in der Modalbox-Dokumentation. Hier ist ein Screenshot:

Initial Modalbox

Beachten Sie, dass das Innere der Modalbox unserer Standardseite sehr ähnlich sieht. Rails verwendet unser Anwendungslayout für alle HTML-Antworten. Da unsere XHRs HTML-Fragmente möchten, ist es sinnvoll, ohne Layouts zu rendern. Beziehen Sie sich auf die Beispielsteuerung. Ich habe eine Methode zur Bestimmung des Layouts eingeführt. Fügen Sie dies zu UserSessionsController hinzu, um das Layout für XHRs zu deaktivieren.

Aktualisieren Sie die Seite und klicken Sie auf den Link, um Folgendes zu erhalten:

Without Layout

Füllen Sie das Formular aus und sehen Sie, was passiert. Wenn Sie das von mit schlechten Informationen ausfüllen, werden Sie außerhalb des Modalfelds umgeleitet. Wenn Sie sich korrekt anmelden, werden Sie normal umgeleitet. Entsprechend den Anforderungen sollte der Benutzer in der Lage sein, das Formular immer wieder in der Modalbox auszufüllen, bis er sich korrekt anmeldet. Wie können wir das erreichen? Wie zuvor beschrieben, müssen wir AJAX verwenden, um Daten an den Server zu senden, und dann JavaScript verwenden, um die modale Box mit dem Formular zu aktualisieren oder eine Umleitung durchzuführen. Wir wissen, dass die Modalbox ein GET für HTML ausführt. Nach dem Anzeigen der anfänglichen Modalbox müssen wir JS schreiben, damit sich das Formular im AJAX-Stil selbst übermittelt. Dadurch kann sich das Formular innerhalb der Modalbox einreichen. Das einfache Hinzufügen dieses Codes nach dem Aufruf der Modalbox funktioniert nicht, da die XHR möglicherweise noch nicht fertig ist. Wir müssen den AfterLoad-Rückruf von Modalbox verwenden. Hier ist der neue Code:

Form #request ist eine bequeme Methode zum Serialisieren und Senden des Formulars über Ajax.Request an die URL des Aktionsattributs des Formulars - genau das, was wir wollen. Jetzt können Sie das Formular innerhalb des Modals ausfüllen, ohne es zu schließen. Die Client-Seite ist jetzt abgeschlossen. Was ist mit der Serverseite? Der Client sendet einen POST, in dem JS zurückgegeben werden soll. Der Server muss entweder JavaScript zurückgeben, um das Formular zu aktualisieren, oder eine Umleitung rendern. Im UserSessionsController verwenden wir reply_to, um die JS-Anforderung zu verarbeiten, und eine Bedingung, um das richtige JS zurückzugeben. Beginnen wir mit der Behandlung des fehlgeschlagenen Anmeldefalls. Der Server muss JS zurückgeben, das das Formular aktualisiert, und das neue Formular anweisen, es über Ajax zu senden. Wir platzieren diese Vorlage in /app/views/users_sessions/create.js.erb. Hier ist die Struktur für die neue Erstellungsaktion:

Füllen wir nun create.js.erb aus:

Zuerst aktualisieren wir den Inhalt, um das neue Formular aufzunehmen. Dann ändern wir die Größe der Modalbox. Als nächstes ajaxifizieren wir das Formular wie zuvor. Voilla, Sie können das Formular so oft ausfüllen, wie Sie möchten.

Bad Info
Updated Form

Als nächstes müssen wir den Umleitungsfall behandeln. Erstellen Sie eine neue Datei in /app/views/users_sessions/redirect.js.erb:

Aktualisieren Sie jetzt die Erstellungsaktion, um den Umleitungsprozess zu handhaben:

Und das ist es! Versuchen Sie nun, sich mit den richtigen Anmeldeinformationen anzumelden, und Sie werden zur privaten Seite weitergeleitet. Versuchen Sie zum weiteren Lernen, einen Drehfeld und eine Benachrichtigung hinzuzufügen, die dem Benutzer mitteilen, dass das Formular gesendet wird oder dass er umgeleitet wird. Die Anwendung funktioniert weiterhin, wenn für den Benutzer auch JavaScript deaktiviert ist.

jQuery

Da ich den Prototyp-Prozess bereits behandelt habe, werde ich nicht mehr auf die gleichen Details wie zuvor eingehen. Stattdessen werde ich schnell das alternative JavaScript beschreiben, das der Anwendung hinzugefügt werden soll. Die jQuery-Version hat genau die gleiche Struktur wie die Prototype-Version. Alles, was wir ändern müssen, ist, was in application.js, create.js.erb und in JavaScript/css enthalten ist.

Als erstes müssen wir jQuery und Facebox herunterladen. Verschieben Sie jQuery als jquery.js in/public/JavaScripts. Verschieben Sie für Facebox die Bilder in/public/images /, Stylesheets in/public/stylesheets und schließlich die JS in/public/JavaScripts. Aktualisieren Sie nun /app/views/layouts/application.html.erb, um die Änderungen widerzuspiegeln:

Facebox wird mit einem Standard-Stylesheet geliefert, das davon ausgeht, dass Sie Ihre Bilder in/facebox haben. Sie müssen diese Selektoren in facebox.css folgendermaßen aktualisieren:

Jetzt hängen wir die Facebox an den Login-Link an. Öffnen Sie /public/JavaScripts/application.js und verwenden Sie Folgendes:

Ich überschreibe die Standardeinstellungen für die Bilder, um den neuen Bildpfad wiederzugeben. Starten Sie den Server und gehen Sie zur Indexseite. Sie sollten eine schöne Facebox mit dem Anmeldeformular sehen:

Facebox

Als nächstes müssen wir das Formular so einstellen, dass es sich über AJAX selbst übermittelt. Wie zuvor müssen wir Rückrufe verwenden, um Code auszuführen, nachdem die Modalbox fertig ist. Wir verwenden die Post-Methode von jQuery für die XHR-Anforderung. Facebox hat einen After-Enthüllungs-Haken, den wir verwenden können. application.js:

Das Aktualisieren von create.js.erb sollte einfach genug sein. Wir müssen den Inhalt der Facebox aktualisieren und das Formular erneut bestätigen. Hier ist der Code:

Und das ist es! Hier ist das Endprodukt:

Logging In
Bad Login
Redirected

Code herunterladen

Den Code erhalten Sie hier. Für jede Bibliothek gibt es Zweige, sodass Sie die Prototype- oder jQuery-Versionen überprüfen können. Fragen, Kommentare, Bedenken? Nochmals vielen Dank für das Lesen!

  • Folgen Sie uns auf Twitter oder abonnieren Sie den Nettuts+ RSS-Feed, um die besten Webentwicklungs-Tutorials im Web zu erhalten.
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.