2009-04-28 18 views
20

Estoy trabajando en un correo electrónico de contraseña olvidada bastante tradicional: deseo enviar por correo electrónico al usuario un token de cambio de contraseña incrustado en un enlace en el que pueden hacer clic para cambiar su contraseña. Estoy enviando un correo electrónico a través del ActionMailer tradicional.¿Cómo configuro el nombre de host para Rails ActionMailer?

Si utilizo una etiqueta normal de link_to

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

me siento un vínculo relativo - bastante inútil de un correo electrónico.

Si añado en

:only_path => false, entonces los errores diciendo que necesito para establecer default_url_options[:host]. Los documentos ActionController implican que debes hacer eso anulando los métodos #default_url_options en tu controlador. Seguramente hay una opción de configuración para decirle a Rails cuál es su nombre de host sin agregar mi propio archivo de configuración, analizarlo, etc.

+0

+1 tanto para la pregunta y la respuesta, esto es tan raro ... ¿por qué es este ajuste en acción de correo electrónico? –

+3

Al enviar un correo electrónico, entonces no hay una solicitud HTTP para tomar e estos valores de. –

Respuesta

36

default_url_options está disponible en config.action_mailer y se debe establecer en el archivo de configuración de su entorno.

Por ejemplo, en config/environments/production.rb:

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

, para probar, modificar config/environments/development.rb:

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

Entonces, suponiendo que tiene una ruta denominada llama forgot_password_login, puede generar la URL del enlace de acceso en su correo usando algo como esto:

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

no tiene una coma "colgada" en su hash default_url_options. Lo editaría pero es una edición de 1 char que está prohibida en SO. – engineerDave

+0

Siento que estoy perdiendo la cabeza. Esto no funciona para mí –

-2

¿Puede usted acaba de hacer

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

la solicitud no está disponible dentro de un mailer –

+0

Exactamente. Podría pasarlo como uno de los parámetros de la generación de correo electrónico, pero decidimos mover este correo electrónico particular para que sea enviado desde nuestro servidor de aplicaciones en lugar del front-end web. Creo que eso significa que necesito hacer ese archivo de configuración personalizada que tiene la URL del sitio web frontend. – edebill

+0

doh, se perdió la parte del correo –

4

Existe otra alternativa, como se describe en http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

Esta solución tiene la ventaja de que no requiere ninguna configuración (por lo tanto, no es una molestia) y funciona bien siempre que envíe correos electrónicos desde dentro de los controladores.

Pero si planea enviar un correo electrónico sin pasar por un controlador (por ejemplo, desde la línea de comandos o en respuesta a otro correo electrónico), necesita la configuración estática.

+0

Es un buen consejo, aunque me temo que necesito la configuración estática. Por alguna razón, sigo encontrando más y más procesamiento que debe ocurrir fuera de un golpe web. – edebill

+0

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

26

Probablemente también desee configurar: protocol => 'https', por cierto.

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

Gracias por el: protocolo => puntero 'https'. el uso de 'portal.example.com' no parece funcionar correctamente, al menos con los anuncios publicitarios de Devise. Las direcciones URL resultantes comienzan con 'https://example.com/' independientemente del subdominio). – Kevin

-1

default_url_options directamente la configuración está en desuso en Rails 3.1

los auxiliares de url_for para crearlo:

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

Configuración default_url_options directamente está en desuso en Rails 3.1. Use url_for en su lugar.

Agregue el parámetro :protocol para anular el valor predeterminado (http), :protocol => 'https://'. Esto creará url que comienza con "https: // ..."en lugar de predeterminado" http: // "

0

Curiosamente, tuve el mismo problema que usted, pero en pruebas unitarias (mientras seguía el railstutorial de Michael Hartl). Tenía esta línea en mi archivo test.rb, pero eso no ayudó:

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

también he añadido otra línea como esta en test.rb, y sorprendentemente esta resuelto el problema

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