如何dynamic地将ActionMailer的default_url_options的主机设置为请求的主机名?

我正在尝试设置:操作邮件程序默认URL选项的主机。

我在下面的所有环境文件中设置

config.action_mailer.default_url_options = { :host => "localhost" } 

我想通过提供请求主机使其更加dynamic化。

当我试图设置它

 config.action_mailer.default_url_options = { :host => request.domain } 

要么

 config.action_mailer.default_url_options = { :host => request.env["SERVER_NAME"] } 

它引发错误…不能识别“请求”对象

有什么办法,我可以设置这个请求主机,而不是硬编码…?

也可以通过设置ActionMailer :: Base.default_url_options散列中的host选项来设置将在所有邮件程序中使用的默认主机

在application_controller.rb before_filter添加:

  ActionMailer::Base.default_url_options = {:host => request.host_with_port} 

或者,您可以在从控制器调用邮件程序function时传递请求

 class UserMailer < ActionMailer::Base def welcome_email(user, request) UserMailer.default_url_options[:host] = request.host_with_port #option1 @user = user @url = user_url(@user, host: request.host_with_port ) #option2 (do this for each link) mail(:to => user.email, :subject => "Welcome to My Awesome Site") end end 

资料来源: http : //guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views

你可以像这样创build一个默认的filter:

 # application_controller.rb before_filter :mailer_set_url_options ... def mailer_set_url_options ActionMailer::Base.default_url_options[:host] = request.host_with_port end 

(来源: http : //www.cherpec.com/2009/06/missing-host-to-link-to-please-provide-host-parameter-or-set-default_url_optionshost/ )

问题是这些是初始化程序,它们在轨道堆栈加载时运行,而不是在您调用活动邮件程序时运行。

但是您不必使用default_url,只需将主机名传递给每个邮件程序视图中的url_for / namedpath即可。 默认只是避免必须这样做。

请参阅http://api.rubyonrails.org/classes/ActionMailer/Base.html有关生成url的部分。;