Aufforderung eines Benutzers zur Anmeldung, nachdem er eine bestimmte Aktion ausgeführt hat

8

Eine Sache, die du auf meiner Rap-Lyrik-Erklärungsseite machen kannst, sind "wie" Erklärungen (sobald du eingeloggt bist):

Ссылка

Ich möchte die "Gefällt mir" -Links für Nutzer anzeigen, die nicht eingeloggt sind. Wenn ein nicht angemeldeter Nutzer auf "Gefällt mir" klickt, zeige ihm eine Lightbox mit einem Anmelde- oder Registrierungsformular (wie Digg / Reddit)

Ссылка

Was ist der beste Weg, dies zu erreichen?

Gegenwärtig verwende ich diesen Ansatz:

  1. Klicken Sie auf "Gefällt mir" -Posts auf /annotations/:id/vote (der POST-Body zeigt an, ob der Benutzer "Gefällt mir" oder "Nicht-mögen").
  2. Die vote Annotation-Controller-Aktion hat eine require_user before_filter , die wie folgt aussieht:

    %Vor%
  3. user_sessions#new sieht so aus:

    %Vor%

Das Problem ist, dass die Weiterleitung nicht korrekt über Javascript funktioniert:

Ссылка

Wie bekomme ich das richtig umleiten?

Ist das auch der richtige allgemeine Ansatz? Ein anderer Gedanke, den ich hatte, war, einen anderen Handler an die "Gefällt mir" -Links in Javascript anzuhängen, wenn es keinen angemeldeten Benutzer gab (aber ich denke nicht, dass diese Methode gut zu anderen Aktionen passt, die ich auf die gleiche Weise behandeln möchte)

    
Tom Lehman 17.01.2010, 22:05
quelle

2 Antworten

3

Hier gibt es ein paar Probleme zu überwinden.

  1. Browser erlauben im Allgemeinen keine Weiterleitung zu einer POST-Anfrage.

  2. redirect_to behält das Format nicht ohne zusätzliche Eingaben bei.

  3. Der Speicherort speichert die Formulardaten nicht.

All diese Probleme können durch Eliminieren von Weiterleitungen gelöst werden.

Hier ist, wie ich es in der Vergangenheit übergeben habe:

Anstatt mandant_user umzulenken, render. Wenn ein Vorher-Filter die ausstehende Aktion umleitet oder rendert, wird sie abgebrochen. (Keine Notwendigkeit, auch falsch zurückzukehren). Leider verwischt dieser Weg Controller Grenzen. Aber es ermöglicht einen einfachen HTML-Fallback und verleiht sich selbst DRYness.

Die High-Level-Ansicht des neuen Arbeitsablaufs lautet:

  1. Anfrage an Anmerkungen # vote (POST)
  2. erforderlicher_benutzerfilter schlägt fehl
  3. rende neue Sitzung
  4. Übergeben Sie die Anmeldedaten und die ursprünglichen POST-Daten an Anmerkungen # vote (POST)
  5. zurück
  6. Der neue Filter in vote erfasst die Sitzungsinformationen und meldet sich an. Die Abstimmung läuft wie erwartet ab. Wenn die Anmeldung fehlschlägt, kehren Sie zu 3 zurück.
  7. Annotationen # vote leitet weiter / rendert wie es sollte

Beginnen Sie mit der Überarbeitung des require_users, um die neue Vorlage user_sessions # zu rendern.

%Vor%

Der @user_session ||= UserSession.new stellt sicher, dass wir Validierungsfehler an das Formular zurücksenden können.

Jetzt müssen wir Ihre neue Vorlage user_session # aufpeppen, damit sie sich an die Aktion erinnern kann. Auch wenn Sie Lightboxen verwenden möchten, sollte dies ein partielles Rendering sein, das von relevanten RJS oder der new.html.erb gerendert wird.

Zuerst erstellen wir ein Partial, um versteckte Felder zu erzeugen, die die POST-Daten erhalten, die in einer Weiterleitung verloren gegangen wären:

%Vor%

Dann render das Teil in der Login-Teil, die Ihre Lightbox besetzen wird:

%Vor%

Der leere Hash für URL im form_tag sieht wie ein Fehler aus, ist es aber nicht. Es stellt sicher, dass die Formulardaten an die URL gesendet werden, die das Formular gerendert hat. Was an dieser Stelle Anmerkungen sein sollten:: id / vote

Jetzt für den neuen Filter anmelden. Im Wesentlichen wird es tun, was UserSessionsController # create ohne Render / Redirect macht. Folgendes wird vom RESTful-Authentifizierungs-Plugin kopiert.

%Vor%

Es muss nur noch sichergestellt werden, dass die Filterreihenfolge korrekt ist.

%Vor%

N.B.: Sie werden diese Version von require_user wahrscheinlich nicht ohne diese Version von authenticate verwenden, daher ist es sinnvoll, sie zu einem einzigen Filter zu kombinieren.

Und das ist es. Die Art und Weise, wie dies eingerichtet wurde, ermöglicht robusten DRY-Code, der leicht wiederverwendbar ist. Indem die neuen Filter in ApplicationController platziert werden, sind sie in jedem Controller verfügbar. Von diesem Punkt aus erfordert das Hinzufügen dieser Funktionalität zu anderen Controllern / Aktionen nur drei einfache Schritte:

  1. Erstellen Sie ein neues partielles Modell nach dem vote_form_replica partial.
  2. Fügen Sie der neuen Sitzungsvorlage die entsprechende Render-Anweisung hinzu.
  3. Übernehmen Sie die Filter für Ihre Aktionen.
EmFi 18.01.2010, 00:10
quelle
0

Ich würde das so angehen, wie Sie es am Ende Ihrer Frage beschreiben. Überprüfen Sie vor dem ersten Anzeigen der Seite, ob der Benutzer angemeldet ist. Wenn dies der Fall ist, sollten die "Gefällt mir" -Links ihr normales Verhalten verwenden. Ist dies nicht der Fall, binden Sie ein Click-Ereignis, um das Registrierungs- / Anmeldefenster anzuzeigen. Es gibt nichts, was nicht wiederverwendet werden kann. In der Tat verwenden wir diese genaue Methode bei meiner Arbeit. Jede Benutzeraktion, die eine Authentifizierung erfordert, folgt entweder ihrem normalen Verhalten oder öffnet ein allgemeines Anmeldefenster, abhängig vom Anmeldestatus zum Zeitpunkt des Ladens der Seite.

    
Jimmy Cuadra 17.01.2010 23:40
quelle

Tags und Links