2010-06-09 2 views
4

Lorsque j'essaie d'envoyer un e-mail à l'utilisateur pour réinitialiser son mot de passe, l'erreur d'expiration de l'exécution persiste. Les autres fonctions de mailer fonctionnent, donc je sais que les paramètres de configuration sont corrects. L'en-tête se lit comme suit: "Délai d'attente :: Erreur dans le mot de passe resetsController # créer"Délai d'exécution d'ActionMailer

Voici le password_resets_controller:

def create 
@user = User.find_by_email(params[:email]) 
if @user 
    User.deliver_password_reset_instructions(@user.id) 
    flash[:notice] = "Instructions to reset your password have been emailed to you. " + 
    "Please check your email." 
    redirect_to '/' 
else 
    flash[:notice] = "No user was found with that email address" 
    render :action => :new 
end 
end 

Voici la méthode à l'intérieur de User.rb

def self.deliver_password_reset_instructions(user_id) 
user = User.find(user_id) 
user.reset_perishable_token! 
Emailer.deliver_password_reset_instructions(user) 
end 

Enfin, ici est la méthode réelle à l'intérieur de emailer.rb:

default_url_options[:host] = "http://0.0.0.0:3000" #development 
def password_reset_instructions(user) 
    @subject       = "Application Password Reset" 
    @from        = '[email protected]' 
    @recipients       = user.email 
    @sent_on       = Time.now 
    @body["edit_password_reset_url"] = edit_password_reset_url(user.perishable_token) 
    @headers["X-SMTPAPI"] = "{\"category\" : \"Password Recovery\"}"#send grid category header 
    end 

Pourquoi "mot de passe" i n le message d'erreur fait référence à un délai d'attente :: erreur

Répondre

1

L'envoi d'un courrier électronique (ou d'autres processus longs) à partir du thread de demande du contrôleur principal n'est pas une bonne idée. L'envoi de l'e-mail peut expirer pour diverses raisons qui ne sont pas sous votre contrôle (par exemple, le serveur de distribution d'e-mails sortants est en panne) et vous ne voulez pas que votre serveur d'applications et les utilisateurs en souffrent.

Une meilleure approche consiste à utiliser un mécanisme de file d'attente tel que Delayed Job (DJ) pour mettre en file d'attente ces tâches de courrier électronique et les traiter en dehors des threads de votre contrôleur.

Voir https://github.com/collectiveidea/delayed_job

L'intégration de ce (ou un autre système de mise en attente) dans votre application Rails est assez simple. Et rails 4 aurait construit dans les services de mise en file d'attente (que je suis encore à utiliser) http://blog.remarkablelabs.com/2012/12/asynchronous-action-mailer-rails-4-countdown-to-2013.

Par exemple, si vous utilisez DJ dans votre application, le nouveau code ressemblera ci-dessous

def self.deliver_password_reset_instructions(user_id) 
user = User.find(user_id) 
user.reset_perishable_token! 
# this is the only line that changes 
Emailer.delay.deliver_password_reset_instructions(user) 
end 

Les travaux sont stockés dans la base de données et rejugés lorsque des erreurs telles que les temps morts se produisent.

Vous pouvez en savoir plus sur DJ sur la page github.