2009-04-28 9 views
20

Ich arbeite an einer ziemlich traditionellen Passwort-vergessen-E-Mail - Ich möchte dem Benutzer ein Passwort ändern Token in einem Link eingebettet, dass sie klicken können, um ihr Passwort zu ändern. Ich maile über den traditionellen ActionMailer.Wie konfiguriere ich den Hostnamen für Rails ActionMailer?

Wenn ich einen normalen link_to Tag

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

verwenden erhalte ich einen relativen Link - ziemlich nutzlos aus einer E-Mail.

Wenn ich in

hinzufügen

:only_path => false, dann Fehlern es sagen, ich brauche default_url_options[:host] einzustellen. Die ActionController-Dokumentation bedeutet, dass Sie dies tun, indem Sie die Methoden #default_url_options in Ihrem Controller überschreiben. Sicherlich gibt es eine Konfigurationsoption, um Rails mitzuteilen, was es für einen Hostnamen ist, ohne meine eigene Konfigurationsdatei hinzuzufügen, sie zu analysieren usw.?

+0

+1 sowohl für die Frage und Antwort, das ist so komisch ... warum ist diese Einstellung bei Action Mailer? –

+3

Wenn Sie eine E-Mail senden, dann gibt es keine HTTP-Anfrage e diese Werte von. –

Antwort

36

default_url_options von config.action_mailer zur Verfügung steht und in Ihrer Umgebung der Konfigurationsdatei festgelegt werden.

Zum Beispiel in config/environments/production.rb:

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

Für die lokale Prüfung, ändern config/environments/development.rb:

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

Dann Sie eine benannte Route forgot_password_login genannt angenommen haben, können Sie die Login-Link-URL generieren in Ihr Mailer, der etwas wie dieses verwendet:

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

nicht Sie haben ein "hängendes" Komma in Ihrem default_url_options Hash. Ich würde es bearbeiten, aber es ist ein 1-Char-Schnitt, der auf SO verboten ist. – engineerDave

+0

Ich fühle mich, als würde ich meinen Verstand verlieren. Das funktioniert nicht für mich –

-2

Können Sie gerade tun

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

Anfrage ist nicht innerhalb eines Mailers verfügbar –

+0

Genau. Ich könnte es als einen der Parameter für die E-Mail-Generierung übergeben - aber wir haben gerade beschlossen, diese bestimmte E-Mail von unserem Anwendungsserver anstelle des Web-Frontends zu senden. Ich denke, das bedeutet, dass ich diese benutzerdefinierte Konfigurationsdatei erstellen muss, die die URL der Frontend-Website enthält. – edebill

+0

doh, verpasste den Mailer Teil –

4

Es gibt eine andere Alternative, wie beschrieben in http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

Diese Lösung hat den Vorteil, dass es keine Konfiguration erfordert (also weniger Aufwand), und funktioniert gut, solange Sie E-Mails von innerhalb der Controller senden.

Aber wenn Sie E-Mail an zu senden, ohne über einen Controller zu gehen (zum Beispiel von der Kommandozeile oder in Antwort auf eine andere E-Mail) zu planen, müssen Sie die statische Konfiguration.

+0

Das ist ein guter Tipp, obwohl ich fürchte, ich brauche die statische Konfiguration. Aus irgendeinem Grund laufe ich immer mehr in die Verarbeitung, die außerhalb eines Web-Treffers passieren muss. – edebill

+0

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

26

Sie wollen wahrscheinlich setzen: Protokoll => 'https' als auch, btw.

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

Danke für die: Protokoll => 'https' Zeiger. die Verwendung von 'portal.example.com' scheint nicht richtig zu funktionieren, zumindest nicht mit Devise-Mailern. Die resultierenden URLs beginnen unabhängig von der Subdomäne mit "https://example.com/". – Kevin

-1

Einstellung default_url_options direkt in Rails 3.1 veraltet

den url_for Helfer Verwenden Sie es zu erstellen:

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

Einstellung default_url_options direkt in Rails 3.1 ist veraltet. Verwenden Sie stattdessen url_for.

Parameter :protocol hinzufügen, um den Standardwert (http), :protocol => 'https://', zu überschreiben. Dadurch wird eine URL erstellt, die mit "https: // ..." beginnt."statt Standard" http: // "

0

Interessanterweise hatte ich das gleiche Problem wie du, aber in Unit-Tests (während Michael Hartl's Railstutorial folgte). Ich hatte diese Zeile in meiner test.rb-Datei, aber das nicht helfen:

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

ich habe auch eine andere Linie so zu test.rb hinzugefügt und überraschend gelöst das Problem dadurch

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