2012-02-22 109 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 %>