Rails E-Mail mit Abmelden-Link

7

Ich arbeite an einer Rails 4.2-App, die wiederkehrende wöchentliche Ereignisse enthält, für die sich Benutzer registrieren. Sie erhalten vor jeder Veranstaltung (wöchentlich) eine Erinnerungs-E-Mail. Ich möchte einen Abmeldelink mit einem Klick auf der E-Mail. Dies scheint eine übliche Aufgabe zu sein, aber ich habe keine gute aktuelle Lösung gefunden. Einige Richtungen, die ich gesehen habe, sind die Verwendung von MessageVerifier, das neu in Rails 4.1 war und es nicht erforderlich macht, eine Token-Zeichenfolge zu speichern, mit der in der Datenbank verglichen werden kann. Was sind die Schritte, um dies zu erreichen? Ich habe ein Benutzermodell und ein Ereignismodell. E-Mails werden an registrierte Benutzer gesendet, die sich für das wiederkehrende Ereignis angemeldet haben.

    
Steve Carey 22.12.2015, 04:41
quelle

2 Antworten

28
___ tag123rubyonrails ___ Ruby on Rails ist ein Open-Source-Full-Stack-Webanwendungs-Framework, das in Ruby geschrieben ist. Es folgt dem populären MVC-Framework-Modell und ist bekannt für seinen "convention over configuration" -Ansatz für die Anwendungsentwicklung. ___ qstnhdr ___ Rails E-Mail mit Abmelden-Link ___ tag123email ___ E-Mail ist eine Methode zum Austauschen digitaler Nachrichten von einem Absender an einen oder mehrere Empfänger. Wenn Sie nachfragen, warum die von Ihnen gesendeten E-Mails als Spam markiert sind, ist das Thema für StackOverflow nicht relevant. ___ answer34779543 ​​___

Hier ist die Lösung, die ich für einen Abmelde-Link für normale E-Mails an Abonnenten erhalten habe. Es verwendet MessageVerifier.

1. Generieren Sie einen kryptografischen Hash der user.id

In meinem Event-Controller habe ich eine send_notice-Aktion, die die E-Mail sendet. Ich werde eine Variable für den Abmelde-Link erstellen und an den Mailer übergeben.

%Vor%

Dies nimmt die Benutzer-ID und erzeugt eine signierte und codierte String-Variable @ unsubscribe. Der Nachrichtenüberprüfer wandelt die Benutzer-ID in eine nicht entzifferbare Zeichenkette um, indem er sie mit Ihrer secret_key_base (in der Datei config / secrets.yml) und dem Namen, den Sie der Nachricht geben, vermischt (in diesem Fall rufe ich sie auf: unsubscribe aber es könnte ein beliebiger Name sein) als was sie ein Salz nennen und es durch einen Algorithmus namens SHA1 laufen lassen. Stellen Sie sicher, dass Ihre secret_key_base sicher bleibt. Verwenden Sie Umgebungsvariablen, um den Wert in der Produktion zu speichern. In der letzten Zeile übergeben wir die Variable @unsubscribe zusammen mit @event und @user Variablen an den Mailer.

2. Fügen Sie dem Mailer

die @unsubscribe-Hash-Variable hinzu %Vor%

3. Setzen Sie den Abmelde-Link in die E-Mail

%Vor%

Beachten Sie, dass das Argument (id: @unsubscribe) hinzugefügt wurde. Dadurch wird die codierte Benutzer-ID an das Ende der URL angehängt, beginnend mit einem? in einem so genannten Abfrageparameter.

4. Routen hinzufügen

Fügen Sie eine Route hinzu, die den Benutzer auf eine Abmeldeseite führt. Dann eine andere Route für, wenn sie die Abbestellung abschicken.

%Vor%

5. Fügen Sie dem Benutzermodell

ein Abonnementfeld hinzu

Ich habe mich dafür entschieden, dem Benutzermodell ein Boolesches Feld (true / false) für Subskriptionen hinzuzufügen, aber Sie können es auf viele verschiedene Arten einrichten. rails g migration AddSubscriptionToUsers subscription:boolean .

6. Controller - Dekodiert die user_id von der URL

Ich habe beschlossen, einen Einstellungs-Controller mit einer Abmeldung und einer Aktualisierungsaktion hinzuzufügen. Erzeuge den Controller rails g controller Settings unsubscribe . Wenn der Benutzer auf den Abmelde-Link in der E-Mail klickt, wird er zur URL weitergeleitet und die verschlüsselte Benutzer-ID an die URL nach dem Fragezeichen als Abfrageparameter angehängt. Hier ist ein Beispiel dafür, wie der Link aussehen würde: Ссылка . Die Abmeldungsaktion verwendet MessageVerifier, um den ID-Parameter zu entfernen und zu decodieren, um die tatsächliche Benutzer-ID abzurufen und diesen zu verwenden, um den Benutzer zu finden und der Variablen @user zuzuweisen.

%Vor%

7. Ansichten

Fügen Sie die Abmeldeseite hinzu, die ein Formular zum Abbrechen des Abonnements enthält.

%Vor%

Es gibt verschiedene Möglichkeiten, dies einzurichten. Hier verwende ich den form_for-Helfer, der mit einem hinzugefügten Argument von id: @ user.id an den settings_update_path weitergeleitet wird. Dadurch wird die Benutzer-ID an die URL angehängt, wenn das Formular als Abfrageparameter gesendet wird. Die Update-Aktion liest sie, um den Benutzer zu finden und das Subscription-Feld auf "false" zu setzen.

    
___ tag123abbestellen ___ hilf uns dieses Wiki zu bearbeiten ___ answer34410127 ___

Eine wirklich gute Option könnte Michael Hartls Rails Tutorial App sein. In Kapitel 12 implementiert er ein System, in dem Benutzer anderen Benutzern Microports folgen können (im Grunde Tweets, Twitter-Stil). Sie müssten lediglich die Modellvalidierungen (Benutzer- und Ereignismodelle) einrichten und ein Beziehungsmodell & amp; Regler. Das Beziehungsmodell und der Controller behandeln den gesamten folgenden Mechanismus. Im Wesentlichen verfügt der Controller nur über Aktionen zum Erstellen und Löschen, und die Aktion create dient dazu, die Beziehung zu erstellen, und die Option destroy, um sie zu löschen. Um das Abmeldungsszenario zu bearbeiten, können Sie einfach rails den Löschpfad in der ActionMailer-Vorlage rendern. Der Link oben gibt Ihnen Schritt für Schritt Anweisungen, aber wenn Sie sich verirren, zögern Sie nicht, mir Fragen zu stellen.

    
___ qstntxt ___

Ich arbeite an einer Rails 4.2-App, die wiederkehrende wöchentliche Ereignisse enthält, für die sich Benutzer registrieren. Sie erhalten vor jeder Veranstaltung (wöchentlich) eine Erinnerungs-E-Mail. Ich möchte einen Abmeldelink mit einem Klick auf der E-Mail. Dies scheint eine übliche Aufgabe zu sein, aber ich habe keine gute aktuelle Lösung gefunden. Einige Richtungen, die ich gesehen habe, sind die Verwendung von MessageVerifier, das neu in Rails 4.1 war und es nicht erforderlich macht, eine Token-Zeichenfolge zu speichern, mit der in der Datenbank verglichen werden kann. Was sind die Schritte, um dies zu erreichen? Ich habe ein Benutzermodell und ein Ereignismodell. E-Mails werden an registrierte Benutzer gesendet, die sich für das wiederkehrende Ereignis angemeldet haben.

    
___
Steve Carey 14.01.2016, 00:18
quelle
2

Eine wirklich gute Option könnte Michael Hartls Rails Tutorial App sein. In Kapitel 12 implementiert er ein System, in dem Benutzer anderen Benutzern Microports folgen können (im Grunde Tweets, Twitter-Stil). Sie müssten lediglich die Modellvalidierungen (Benutzer- und Ereignismodelle) einrichten und ein Beziehungsmodell & amp; Regler. Das Beziehungsmodell und der Controller behandeln den gesamten folgenden Mechanismus. Im Wesentlichen verfügt der Controller nur über Aktionen zum Erstellen und Löschen, und die Aktion create dient dazu, die Beziehung zu erstellen, und die Option destroy, um sie zu löschen. Um das Abmeldungsszenario zu bearbeiten, können Sie einfach rails den Löschpfad in der ActionMailer-Vorlage rendern. Der Link oben gibt Ihnen Schritt für Schritt Anweisungen, aber wenn Sie sich verirren, zögern Sie nicht, mir Fragen zu stellen.

    
Jarrel09 22.12.2015 06:59
quelle