【问题标题】:What is ActionMailer default_url_options?什么是 ActionMailer default_url_options?
【发布时间】:2017-10-13 04:18:23
【问题描述】:

我一定不明白一些关于电子邮件的琐碎事情,但 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
  }

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    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 服务器的名称(用于绝对链接)取自传入的请求信息。但是在呈现电子邮件时您没有这些信息可用(没有请求),这就是为什么您必须手动提供它,以便电子邮件中的链接正常工作。

    【讨论】:

      【解决方案2】:

      您是否曾尝试在 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 更好。 这就是我们这样做的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-26
        • 2019-06-19
        • 2016-01-09
        • 2011-08-31
        • 1970-01-01
        • 2016-02-12
        • 1970-01-01
        • 2012-05-23
        相关资源
        最近更新 更多