web-dev-qa-db-ja.com

ActionMailer default_url_optionsとは何ですか?

電子メールについて些細なことを理解してはなりませんが、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
  }
14
user782220

default_url_options設定は、電子メールテンプレートのURLをリンクの構築に役立ちます。通常、:Host、つまりWebサーバーの完全修飾名は、この構成オプションで設定する必要があります。 sending emailとは何の関係もありません。リンクの表示のみを設定します。

これを設定する必要性は、 Rails Guides にも詳しく記載されています ActionMailer::Baseソース

URLは、url_forまたは名前付きルートを使用してメーラービューで生成できます。アクションパックのコントローラーとは異なり、メーラーインスタンス受信リクエストに関するコンテキストはありませんなので、URLを生成するために必要なすべての詳細を提供する必要があります。

Url_forを使用する場合は、:Host:controller、および:action:

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

名前付きルートを使用する場合は、:Host

<%= users_url(Host: "example.com") %>

そのため、Webページでドキュメントを言い換えるために、現在のWebサーバーの名前(絶対リンクで使用される)は、着信要求情報から取得されます。ただし、電子メールをレンダリングするときにこの情報を使用できないため(要求はありません)、電子メールのリンクが適切に機能するように、手動で提供する必要があります。

22
BoraMa

ActionMailerテンプレート内でURLを生成しようとしたことがありますか?少なくとも1回行ったことがあれば、おそらく次のエラーに精通しているでしょう。

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ガイドに示されているように、Host値をActionMailerに渡すには基本的に2つの方法があります。

1. set a global value
2. pass the option each time you generate an URL

default_url_optionsを定義する方が、毎回URLを渡すよりも優れています。それが私たちがする理由です。

5
Chetan Mehta