ActionMailer default_url_options是什么?

23

我可能对电子邮件中的某些细节不理解,但是 defaul_url_options 中的 host 是什么意思?配置 smtp 设置使电子邮件如何发送对我有意义,但 default_url_options 与此有何关系?

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<your heroku app>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
2个回答

42
default_url_options设置对于在电子邮件模板中构建链接URL非常有用。通常需要使用此配置选项设置:host,即Web服务器的完全限定名称。它与发送电子邮件无关,仅配置电子邮件中的显示链接
设置此内容的需求在Rails GuidesActionMailer::Base sources中有很好的文档记录:

可以使用url_for或命名路由在邮件视图中生成URL。与Action Pack中的控制器不同,邮件实例没有关于传入请求的任何上下文,因此您需要提供生成URL所需的所有详细信息。

使用url_for时,您需要提供:host:controller:action:

<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>

当使用命名路由时,您只需要提供:host参数。

<%= users_url(host: "example.com") %>
因此,为了改写文档,在网页中,当前web服务器的名称(用于绝对链接)取自传入请求信息。 但是在呈现电子邮件时,您没有此信息可用(没有请求),这就是为令电子邮件中的链接正常工作,您必须手动提供该信息。

5

您是否曾经在ActionMailer模板中尝试生成URL?如果您至少尝试过一次,那么您可能会熟悉以下错误:

ActionView::TemplateError (Missing host to link to! Please provide :host parameter or set default_url_options[:host])

这是因为ActionMailer实例没有任何关于传入请求的上下文信息,所以您需要提供:host、:controller和:action。如果使用命名路由,ActionPack会为您提供控制器和操作名称。否则,使用url_for辅助程序,您需要传递所有参数。
<%= message_url %>
<%= url_for :controller => "messages", :action => "index" %>

无论您选择哪种方式,都需要提供主机选项来生成ActionMailer中的URL。正如ActionMailer指南所示,您基本上有两种方法将主机值传递给ActionMailer:

1. set a global value
2. pass the option each time you generate an URL
定义default_url_options比每次传递URL更好。这就是我们的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接