如何将ActionMailer default_url_options:host动态设置为请求的主机名?

Mad*_*han 41 ruby ruby-on-rails

我正在尝试设置:host for action mailer default url options.

我在所有环境文件中都有以下设置

config.action_mailer.default_url_options = {
  :host => "localhost"
}
Run Code Online (Sandbox Code Playgroud)

我希望通过提供请求主机使其更具动态性.

当我尝试设置它时

config.action_mailer.default_url_options = {
  :host => request.domain
}
Run Code Online (Sandbox Code Playgroud)

要么

config.action_mailer.default_url_options = {
  :host => request.env["SERVER_NAME"]
}
Run Code Online (Sandbox Code Playgroud)

它抛出错误...无法识别"请求"对象

有什么办法可以将它设置为请求主机,而不是通过硬编码......?

mon*_*ike 45

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

在一个application_controller.rb补充:

class ApplicationController < ActionController::Base
  def default_url_options
    { host: request.host_with_port }
  end
end
Run Code Online (Sandbox Code Playgroud)

资料来源:https://edgeguides.rubyonrails.org/action_controller_overview.html#default-url-options

或者,您可以在request从控制器调用邮件程序功能时传递

class UserMailer < ActionMailer::Base

  def welcome_email(user, request)
    @user = user
    @url  = user_url(@user, host: request.host_with_port ) # do this for each link
    mail(:to => user.email, :subject => "Welcome to My Awesome Site")
  end
end
Run Code Online (Sandbox Code Playgroud)

资料来源:https://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-with-named-routes

  • ActionMailer :: Base无权访问请求对象. (15认同)
  • before filter方法有效,但不是线程安全的,因此只适用于涉及单个域的情况. (3认同)

Die*_*ntz 10

更新:使用选定的响应,因为这不是线程安全的.

您可以像这样创建默认过滤器:

# 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
Run Code Online (Sandbox Code Playgroud)

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


Doo*_*oon 6

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

但是您不必使用default_url,您只需将主机名传递到每个邮件程序视图中的url_for/named路由.默认只是避免必须这样做.

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