2012-02-22 10 views
15

Sto provando a inserire un'istruzione link_to in un messaggio di posta elettronica Mailer che include il percorso completo (ad esempio http://localhost/contacts/id/confirm). L'istruzione link_to che sto cercando funziona nella mia vista standard in/pages/options, ma non nell'email Mailer.Come includere percorso completo nell'istruzione link_to di Rails 3?

Ecco il mio/pages/opzioni Controller cod:

class PagesController < ApplicationController 
    def options 
    end 
end 

Ed ecco la pagine/opzioni Vista:

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

Quando ho messo questo link nel seguente mailer (welcome_email.html. rb), sto ricevendo l'errore qui sotto. Qualsiasi aiuto con questo sarà molto apprezzato.

<!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> 

Il messaggio di errore:

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> 

risposta

13

Perché mailer non vengono eseguiti all'interno della pila di risposta, non hanno idea di che cosa ospite sono stati chiamati da: ecco perché stai incontrando questo errore. E 'facile da risolvere, modificare il codice per includere l'host:

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

È inoltre possibile impostare l'host di default su una base per-applicazione all'interno del vostro application.rb (o uno dei suoi ambienti) specificando in questo modo:

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

Per la documentazione completa sul ActionMailer e perché si verifica questo problema, controlla la ActionMailer documentation.

+0

Funziona perfettamente! Grazie (e altri) per il tuo aiuto! –

1

è necessario fornire l'opzione :host con l'link_to.

è anche possibile impostare il config.action_mailer.default_url_options in config/ambienti/* rb file alle impostazioni appropriate in modo che siano scelti per link_to in tutti i programmi di posta

ad esempio -.

in config/ambienti/produzione. rb

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

Primo passo:

#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' } 

Secondo passo:

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

Grazie zolter. Altri, se ancora non funziona, una cosa importante ma delicata da accertare è che si sta utilizzando confirm_contacts_url() e non confirm_contacts_path(). _path restituisce sempre un url relativo anche se l'host è impostato correttamente nella configurazione. – Kelvin

+0

@Kevin grazie, ha risolto il mio problema – Gediminas

+0

Grazie anche a @Kelvin mio! – Paludis

0

Se l'URL completo corrisponde sempre la richiesta dell'utente, è possibile in alternativa utilizzare il actionmailer-with-request gemma di avere la richiesta inoltrata all'azione mailer, allora è possibile fare riferimento alla richiesta all'interno del tuo modello di posta, come:

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