web-dev-qa-db-fra.com

Qu'est-ce que ActionMailer default_url_options?

Je ne dois pas comprendre quelque chose de banal à propos du courrier électronique, mais que fait l'hôte dans defaul_url_options? La nécessité des paramètres smtp est logique pour moi de configurer la façon dont l'e-mail sera envoyé, mais en quoi default_url_options est-il pertinent?

  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

Le default_url_options Le paramètre est utile pour construire des URL de lien dans des modèles d'e-mail . Généralement, le :Host, c'est-à-dire le nom complet du serveur Web, doit être configuré avec cette option de configuration. Cela n'a rien à voir avec envoi e-mails, il configure uniquement affichage des liens dans les e-mails.

La nécessité de définir cela est bien documentée dans les Rails Guides ainsi ActionMailer::Base sources :

Les URL peuvent être générées dans des vues de mailer en utilisant url_for ou des routes nommées. Contrairement aux contrôleurs d'Action Pack, l'instance de messagerie n'a pas de contexte sur la demande entrante , vous devrez donc fournir tous les détails nécessaires pour générer une URL.

Lorsque vous utilisez url_for, vous devez fournir le :Host, :controller, et :action:

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

Lorsque vous utilisez des routes nommées, vous devez uniquement fournir le :Host

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

Ainsi, pour reformuler les documents, dans les pages Web, le nom du serveur Web actuel (à utiliser dans les liens absolus) est tiré des informations de demande entrantes. Mais vous ne disposez pas de ces informations lors du rendu d'un e-mail (il n'y a pas de demande), c'est pourquoi vous devez les fournir manuellement, afin que les liens dans les e-mails fonctionnent correctement.

22
BoraMa

Avez-vous déjà essayé de générer des URL dans un modèle ActionMailer? Si vous l'avez fait au moins une fois, vous connaissez probablement l'erreur suivante:

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

Cela se produit car l'instance ActionMailer n'a pas de contexte sur la demande entrante, vous devrez donc fournir les éléments: Host,: controller et: action :. Si vous utilisez une route nommée, ActionPack vous fournit les noms de contrôleur et d'action. Sinon, avec l'aide de url_for, vous devez passer tous les paramètres.

<%= message_url %>
<%= url_for :controller => "messages", :action => "index" %>

Quel que soit votre choix, vous devez toujours fournir l'option Hôte pour générer une URL dans ActionMailer. Comme le montre le guide ActionMailer, vous avez essentiellement deux façons de transmettre la valeur Host à ActionMailer:

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

Il est préférable de définir default_url_options que de passer l'URL à chaque fois. Voilà pourquoi nous le faisons.

5
Chetan Mehta