2009-04-28 6 views
20

Je travaille sur un email de mot de passe oublié assez traditionnel - je veux envoyer un email à l'utilisateur un jeton de changement de mot de passe incorporé dans un lien sur lequel ils peuvent cliquer pour changer leur mot de passe. J'envoie des e-mails via le traditionnel ActionMailer.Comment configurer le nom d'hôte pour Rails ActionMailer?

Si j'utilise une balise link_to normale

<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %> 

obtenir un lien relatif - plutôt inutile d'un e-mail.

Si j'ajoute dans

:only_path => false, il erreur en disant que je dois mettre default_url_options[:host]. Les documents ActionController impliquent que vous le faites en remplaçant les méthodes #default_url_options dans votre contrôleur. Il y a sûrement une option de configuration pour dire à Rails ce qu'est son nom d'hôte sans ajouter mon propre fichier de configuration, l'analyser, etc?

+0

+1 pour la question et la réponse, il en est ainsi bizarre ... pourquoi est ce paramètre sur l'action mailer? –

+3

Lors de l'envoi d'un e-mail, il n'y a pas de requête HTTP à prendre e ces valeurs de. –

Répondre

36

default_url_options est disponible à partir config.action_mailer et doit être réglé dans le fichier de configuration de votre environnement.

Par exemple, dans config/environments/production.rb:

config.action_mailer.default_url_options = { 
    :host => 'www.yourdomain.com' 
} 

Pour les tests locaux, modifier config/environments/development.rb:

config.action_mailer.default_url_options = { 
    :host => '127.0.0.1', 
    :port => 3000 
} 

Ensuite, supposant que vous avez une route nommée appelée forgot_password_login, vous pouvez générer le lien URL de connexion dans votre expéditeur utilisant quelque chose comme ceci:

forgot_password_login_url(:token => 'a7s8q15sk2...') 
+0

pas vous avez une virgule "pendante" dans votre hachage default_url_options. Je l'éditerais mais c'est un edit de 1 char qui est verboten sur SO. – engineerDave

+0

J'ai l'impression de perdre la tête. Cela ne fonctionne pas pour moi –

-2

pouvez-vous faire juste

<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%> 
+5

La requête n'est pas disponible dans un publipostage –

+0

Exactement. Je pourrais le passer comme l'un des paramètres de la génération d'email - mais nous avons juste décidé de déplacer cet email particulier à être envoyé à partir de notre serveur d'application au lieu de l'interface Web. Je pense que cela signifie que j'ai besoin de faire ce fichier de configuration personnalisé qui a l'URL du site web frontal. – edebill

+0

doh, raté la partie mailer –

4

Il existe une autre alternative, comme décrit dans http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

Cette solution présente l'avantage de ne nécessiter aucune configuration (donc moins de tracas), et fonctionne très bien tant que vous envoyez des emails depuis des contrôleurs. Mais si vous envisagez d'envoyer des courriers électroniques sans passer par un contrôleur (par exemple, à partir de la ligne de commande ou en réponse à un autre courrier électronique), vous avez besoin de la configuration statique.

+0

C'est un bon conseil, même si j'ai peur d'avoir besoin de la configuration statique. Pour une raison quelconque, je continue à courir dans un traitement de plus en plus qui doit se produire en dehors d'un coup de Web. – edebill

+0

lien actuel. http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/ – Sudhir

26

Vous souhaitez probablement définir: protocole => 'https', btw.

config.action_mailer.default_url_options = { 
    :host => "portal.example.com", 
    :protocol => 'https' 
} 
+0

Merci pour le: protocole => pointeur "https". l'utilisation de 'portal.example.com' ne semble pas fonctionner correctement, au moins avec les mailers Devise. Les URL résultantes commencent par "https://example.com/", quel que soit le sous-domaine. – Kevin

-1

Réglage default_url_options directement dans Rails est déconseillés 3.1

Utilisez l'aide url_for pour le créer:

<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %> 
0

Réglage default_url_options directement dans Rails est désapprouvée 3.1. Utilisez url_for à la place.

Ajoutez le paramètre :protocol pour remplacer la valeur par défaut (http), :protocol => 'https://'. Cela va créer une URL commençant par "https: // ..."au lieu de défaut" http: // "

0

Fait intéressant, j'ai eu le même problème que vous, mais dans les tests unitaires (en suivant le railstutorial de Michael Hartl) .J'avais cette ligne dans mon fichier test.rb, mais que n'a pas aidé:

config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' } 

J'ai aussi ajouté une autre ligne comme celui-ci à test.rb, et de façon surprenante cette résolu le problème

default_url_options = { host: 'example.com', protocol: 'http' } 
Questions connexes