2012-02-07 20 views
0

我需要能夠生成鏈接到所有運行我的應用程序但具有不同域的網站(我正在運行白標服務)。在actionmailer中,你如何在運行時重寫default_url_options?

代表這些域發送的電子郵件根據郵件設置不同的主機。

一般情況下我安裝了hostapplication.rb中

config.action_mailer.default_url_options[:host] = 'myhost.com' 

但是,因爲我的主人根據我想在運行時要做到這一點,而不是鏈接變化。

user_mailer.rb

Rails.configuration.action_mailer.default_url_options[:host] = new_host 
mail(...) 

的問題是,我每次運行此它繼續使用任何在application.rb定義的時間。我似乎無法讓應用程序尊重default_url_optiions[:host]新定義的值。我究竟做錯了什麼?

回答

1

如果沒有很多的意見,你可以簡單地定義在url_for helper上的主機,如果有太多的意見,我建議你編寫你自己的幫手包裝url_for幫手:host => 'mysite.com'

+0

謝謝。你知道你是否可以強制主持人在實際的路徑助手上,例如'new_user_url主機:'testhost.com''? – 2012-02-07 16:58:34

0

default_url_options方法是在ActionMailer上使用ClassSuite的ActiveSupport核心擴展中定義的class_attribute設置的。根據文檔,它還提供了一個實例級別訪問器,可以在不影響類級別方法的情況下基於每個實例重寫。所以,你應該能夠覆蓋該主機直接爲每個電子郵件

class UserMailer < ActionMailer::Base 
    def welcome(user) 
    @user = user 

    # don't need this if you override #mail method. 
    self.default_url_options = default_url_options.merge(host: @user.host) 

    mail(to: user.email, subject: "Welcome") 
    end 

    # might be better to override mail method if you need it for all emails in 
    # a particular mailer 
    private 

    def mail(headers, &block) 
    self.default_url_options = default_url_options.merge(host: @user.host) 

    super 
    end 
end 

這應該允許您在運行時修改的設置的設置;請忽略@ user.host呼叫並將其替換爲您要確定的主機。

相關問題