2012-02-22 107 views
15

我正在尝试在包含完整路径的邮件程序电子邮件中放入Rails link_to语句(即 - http://localhost/contacts/id/confirm)。我尝试的link_to语句在我的标准View in/pages/options中工作,但不在Mailer email中。如何在Rails 3 link_to语句中包含完整路径?

这是我/页/选项控制器代码:

class PagesController < ApplicationController 
    def options 
    end 
end 

而这里的页/选项查看:

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

当我把这个链接到以下邮件(welcome_email.html。 RB),我得到下面的错误。任何帮助,将不胜感激。

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

错误消息:

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> 

回答

13

因为邮件程序不响应堆内运行,他们不知道什么样的主机他们被称为:这就是为什么你遇到这个错误。这很容易修复,修改代码,包括主机:

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

您还可以设置你的里面application.rb中的对每个应用程序的缺省主机(或您的任何环境中)通过指定这样的:

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

有关的ActionMailer完整的文件,为什么会出现这个问题,检查出ActionMailer documentation

+0

完美地工作!谢谢(和其他人)的帮助! – 2012-02-23 10:24:22

1

您需要提供:host选项与link_to

您还可以设置config.action_mailer.default_url_options的config /环境/ * RB文件到相应的设置,使他们在所有邮寄

采摘的link_to如 -

在配置/环境/生产

。 RB

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

第一步:

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

第二步:

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

谢谢zolter。其他人,如果这仍然不起作用,确保一个重要但微妙的事情是您使用的是confirm_contacts_url()而不是confirm_contacts_path()。即使主机在您的配置中正确设置,_path始终会返回相对url。 – Kelvin 2012-07-23 23:41:28

+0

@Kevin谢谢,它解决了我的问题 – Gediminas 2013-05-19 19:01:11

+0

谢谢@Kelvin雷! – Paludis 2014-01-17 06:16:58

0

如果完整的网址永远是用户的要求相匹配,则可以选择使用actionmailer-with-request宝石有请求转发到行动邮件,那么你可以参考请求在您的邮件模板中,如:

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