什么是ActionMailer default_url_options?

use*_*220 15 ruby-on-rails actionmailer

我不能理解关于电子邮件的微不足道的事情,但是defaul_url_options中的主机有什么作用?我需要配置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
  }
Run Code Online (Sandbox Code Playgroud)

Bor*_*aMa 24

default_url_options设置对于在电子邮件模板中构建链接URL非常有用.通常,:host需要使用此配置选项设置Web服务器的完全限定名称.它与发送电子邮件无关,它只配置在电子邮件中显示链接.

Rails指南以及ActionMailer::Base来源中都很好地记录了设置它的必要性:

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

当使用url_for你需要提供:host,:controller以及:action:

<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>
Run Code Online (Sandbox Code Playgroud)

使用命名路由时,您只需提供 :host

<%= users_url(host: "example.com") %>
Run Code Online (Sandbox Code Playgroud)

因此,要重新编写文档,在网页中,将从传入的请求信息中获取当前Web服务器的名称(将在绝对链接中使用).但是在呈现电子邮件时没有这些信息(没有请求),这就是为什么你必须手动提供它,以便电子邮件中的链接正常工作.


Che*_*hta 5

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

ActionView::TemplateError (Missing host to link to! Please provide :host parameter or set default_url_options[:host])
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为ActionMailer实例没有关于传入请求的任何上下文,因此您需要提供:host,:controller和:action:。如果使用命名路由,则ActionPack会为您提供控制器和动作名称。否则,需要使用url_for帮助器传递所有参数。

<%= message_url %>
<%= url_for :controller => "messages", :action => "index" %>
Run Code Online (Sandbox Code Playgroud)

无论您选择哪种方式,都始终需要提供主机选项​​才能在ActionMailer中生成URL。如ActionMailer指南所示,您基本上可以通过两种方法将主机值传递给ActionMailer:

1. set a global value
2. pass the option each time you generate an URL
Run Code Online (Sandbox Code Playgroud)

定义default_url_options比每次传递URL更好。这就是我们这样做的原因。