2012-02-22 19 views
15

estoy tratando de poner declaración link_to unos rieles dentro de un correo electrónico Mailer que incluye la ruta completa (es decir, - http://localhost/contacts/id/confirm). La instrucción link_to que estoy intentando funciona en mi vista estándar en/pages/options, pero no en el correo electrónico de Mailer.¿Cómo incluir la ruta completa en Rails 3 link_to statement?

Aquí es mi/pages/opciones de código de controlador:

class PagesController < ApplicationController 
    def options 
    end 
end 

Y es aquí la páginas/Ver Opciones:

<div> 
    <%= link_to "here", :controller => "contacts", :action => "confirm", 
    :only_path => false, :id => 17 %> 
</div> 

Cuando pongo este vínculo en el siguiente anuncio publicitario (welcome_email.html. rb), obtengo el error a continuación. Cualquier ayuda al respecto será enormente apreciada.

<!DOCTYPE html> 
<html> 
<head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> 
</head> 
<body> 
    <%= link_to "here", :controller => "contacts", :action => "confirm", 
    :only_path => false, :id => 17 %> 
</body> 
</html> 

El mensaje de error:

RuntimeError in Contacts#create 

Showing C:/Documents and Settings/Corey Quillen/My Documents/Dev/Dev  
Projects/my_project 
Project/my_project/app/views/user_mailer/welcome_email.html.erb where line #7 
raised: 

Missing host to link to! Please provide :host parameter or set 
default_url_options[:host] 
Extracted source (around line #7): 

4:  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> 
5: </head> 
6: <body> 
7:  <%= link_to "here", :controller => "contacts", :action => "confirm", :only_path  
=> false, :id => 17 %> 
8: </body> 
9: </html> 

Respuesta

13

Debido a que los anuncios publicitarios no se ejecutan dentro de la pila respuesta, no tienen idea de qué anfitrión fueron llamados desde: es por eso que te encuentras con este error. Es fácil de arreglar, cambiar el código para incluir el anfitrión:

<%= link_to "here", :controller => "contacts", :action => "confirm", 
:only_path => false, :id => 17, :host => "example.com" %> 

También puede configurar el host predeterminado en función de cada aplicación interior de su application.rb (o cualquiera de sus entornos) especificando lo siguiente:

config.action_mailer.default_url_options = { :host => "example.com" } 

Para la documentación completa sobre ActionMailer y por qué se produce este problema, echa un vistazo a la ActionMailer documentation.

+0

¡Funciona a la perfección! ¡Gracias (y otros) por tu ayuda! –

1

es necesario proporcionar la opción :host con el link_to.

También puede establecer la config.action_mailer.default_url_options en config/ambientes/* rb archivos en los ajustes apropiados de modo que se escojan para link_to en todos los anuncios publicitarios

por ejemplo -.

en config/ambientes/producción. rb

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

Primer paso:

#config/environments/production.rb 
config.action_mailer.default_url_options = { :host => 'www.example.com' } 

#config/environments/development.rb 
config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

Segundo paso:

<%= link_to "here", confirm_contacts_url(17) %> 
+9

Gracias zolter. Otros, si esto todavía no funciona, una cosa importante pero sutil para garantizar es que está utilizando confirm_contacts_url() y no confirm_contacts_path(). _path siempre devuelve una URL relativa incluso si el host está configurado correctamente en tu configuración. – Kelvin

+0

@Kevin gracias, resolvió mi problema – Gediminas

+0

Gracias @Kelvin mía también! – Paludis

0

Si la URL completa siempre coincide con la solicitud del usuario, se puede utilizar como alternativa la gema actionmailer-with-request tener la solicitud se remitirá al anuncio publicitario de la acción, a continuación, puede hacer referencia a la solicitud dentro de su plantilla de correo, como:

<%= link_to "log into the admin page", request.base_url + admin_root_path %> 
Cuestiones relacionadas