Devise / ActionMailer sendet doppelte E-Mails zur Registrierungsbestätigung

7

Meine Rails-Anwendung verwendet Devices, um Registrierung, Authentifizierung usw. zu handhaben. Ich verwende das Bestätigungsmodul. Der Fehler ist folgendes: Wenn sich ein Benutzer bei der E-Mail anmeldet, sendet Devise zwei Bestätigungs-E-Mails mit verschiedenen Bestätigungslinks. Ein Link funktioniert, der andere verweist den Benutzer auf eine Fehlerseite.

Devise spuckt eine Nachricht aus, die mit dem Fehler verbunden ist: "Bestätigungs-Token ist ungültig" und bringt den Benutzer zur Seite "Bestätigungs-E-Mail erneut senden".

Ich hosste mit heroku und benutze sendgrid, um die E-Mails zu senden. update: Der Fehler tritt auch bei localhost auf.

Ich habe keine Ahnung, wo der Grund dieses Fehlers liegt, und das könnte mehr Code sein als das, was Sie sehen müssen:


Modelle / user.rb

%Vor%



Controller / registrations_controller.rb

%Vor%



Controller / omniauth_callbacks_controller

%Vor%



config / routes.rb

%Vor%

Ich freue mich, bei Bedarf weitere Informationen zur Verfügung zu stellen. Ich bin auch offen für das Anpassen / Überschreiben des Devise-Mailer-Verhaltens, aber ich weiß nicht, wie ich das anstellen soll.

Vielen Dank!

    
stephenalexbrowne 25.10.2012, 04:52
quelle

3 Antworten

13

Gelöst!

Ich war in der Lage, Devise :: Mailer zu überschreiben und einen Stack-Trace zu erzwingen, um genau herauszufinden, was zu doppelten E-Mails geführt hat. Devise :: Mailer # confirmation_instructions wurde zweimal aufgerufen, und ich stellte fest, dass das Problem mit meinem: after_create Callback, wie unten gezeigt, aufgetreten ist:


in models / user.rb ...

%Vor%

Beim Aufruf von self.save wurde der Mailer erneut ausgelöst. Ich löste das Problem, indem ich änderte, wenn die Punkte hinzugefügt werden. Ich habe den After_create Call losgeworden und die Bestätigung überschrieben! Methode im Gerät so aussehen:

%Vor%

Nun wird der Benutzerdatensatz erst nach der Bestätigung geändert (Punkte hinzugefügt). Keine doppelten E-Mails mehr!

    
stephenalexbrowne 25.10.2012, 05:51
quelle
8

Ich ging ursprünglich mit Thomas Klemms Antwort, aber ich ging zurück, um mir das anzuschauen, als ich etwas Zeit hatte, um herauszufinden, was los war, weil es sich nicht richtig anfühlte.

Ich habe das "Problem" ausfindig gemacht und bemerkt, dass es nur passiert, wenn: confirmable in Ihrem Geräte- (Benutzer) -Modell eingestellt ist und reconfirmable im Geräte-Initialisierer aktiviert ist - was im Nachhinein sehr sinnvoll ist, da im Wesentlichen im after_create Wir ändern das Benutzermodell, obwohl wir die E-Mail-Adresse nicht ändern - ich vermute, dass Devise dies tun kann, weil das Konto noch nicht bestätigt ist, aber auf jeden Fall ist es einfach, die zweite E-Mail einfach durch Anrufen zu stoppen self.skip_reconfirmation! in der after_create-Methode.

Ich habe ein Musterschienenprojekt mit ein paar Tests erstellt, um das korrekte Verhalten sicherzustellen. Unten sind die wichtigsten Auszüge. Wenn Sie viel zu viel Zeit haben, können Sie das Projekt hier sehen: Ссылка

app / models / User.rb

%Vor%

initializers / devise.rb

%Vor%

spec / models / user_spec.rb

%Vor%

Das Ausführen der rspec-Tests, um sicherzustellen, dass nur eine E-Mail gesendet wird, bestätigt das Verhalten:

  

..

     

Beendet in 0.87571 Sekunden 2 Beispiele, 0 Fehler

    
Richard Hollis 11.03.2013 18:09
quelle
2

Danke für deine großartige Lösung, Stephen! Ich habe es ausprobiert und es funktioniert perfekt, um in die confirm! -Methode einzuhaken. In diesem Fall wird die Funktion (wie der Name sagt) aufgerufen, wenn der Benutzer auf den Bestätigungslink in der E-Mail klickt, die er erhält.

Alternativ können Sie auch in die Methode generate_confirmation_token einhaken, sodass Ihre Methode direkt aufgerufen wird, wenn das Bestätigungstoken erstellt und die E-Mail gesendet wird.

%Vor%

Relevante Quelle des Bestätigungsmoduls .

    
Thomas Klemm 15.02.2013 19:57
quelle