2009-04-28 82 views
20

我正在處理一個相當傳統的忘記密碼電子郵件 - 我想通過電子郵件向用戶發送一個密碼更改令牌,該令牌嵌入鏈接中,以便他們可以點擊以更改密碼。我通過傳統的ActionMailer發送電子郵件。如何爲Rails ActionMailer配置主機名?

如果我用一個正常的link_to標籤

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

我得到一個相對鏈接 - 從電子郵件,而沒用。

如果我加入

:only_path => false,那麼它錯誤說我需要設置default_url_options[:host]。 ActionController文檔暗示你通過覆蓋控制器中的#default_url_options方法來做到這一點。當然,有一個配置選項可以告訴Rails它的主機名是不需要添加我自己的配置文件,解析它等等?

+0

+1兩者的問題和答案,這是如此怪異的......爲什麼這個設置在動作郵件上? – 2009-08-19 11:53:14

+3

發送郵件時,沒有HTTP請求e這些值來自。 – 2011-05-02 05:20:36

回答

36

default_url_options可從config.action_mailer,應該在你的環境中的配置文件進行設置。

例如,在config/environments/production.rb

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

對於本地測試,修改config/environments/development.rb

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

然後,假設你有一個名爲路線稱爲forgot_password_login,您可以生成登錄鏈接網址你的郵件使用這樣的東西:

forgot_password_login_url(:token => 'a7s8q15sk2...') 
-2

可你只是做

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

請求在郵件程序中不可用 – 2009-04-28 18:00:33

+0

準確無誤。我可以將它作爲電子郵件生成的參數之一傳遞 - 但我們只是決定將此特定電子郵件從我們的應用服務器而不是Web前端發送。我認爲這意味着我需要製作自定義配置文件,其中包含前端網站的URL。 – edebill 2009-04-28 18:26:29

+0

doh,錯過了它的郵件部分 – 2009-04-28 21:12:20

4

還有另外一種選擇,如http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

該解決方案具有的優點是不需要任何配置(因此少了麻煩)的優勢描述,並罰款,只要你從控制器中發送電子郵件的作品。

但是,如果您計劃在不通過控制器的情況下發送電子郵件(例如從命令行或響應另一封電子郵件),則需要靜態配置。

26

您可能想要設置:protocol =>'https'以及btw。

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

設置default_url_options直接用Rails 3.1不贊成

使用url_for助手來創建它:

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

設置default_url_options直接用Rails 3.1棄用。改爲使用url_for

添加參數:protocol以覆蓋默認值(http):protocol => 'https://'。這將創建以「https://」開頭的網址...「而不是默認的」http://「

0

有趣的是,我遇到了和你一樣的問題,但是在單元測試中(在Michael Hartl的railstutorial之後),我在test.rb文件中有這條線,但是沒有幫助:

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

我還添加了另一條線像這樣test.rb,令人驚訝的解決了這個問題

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