Heroku / devise – Hôte manquant pour créer un lien! Veuillez fournir: paramètre host ou set default_url_options

J’essaie de pousser mon application sur heroku. Je suis toujours en dev. J’utilise un appareil avec le module confirmable.

Lorsque j’essaie d’append un utilisateur avec la console Heroku, j’ai cette erreur:

Missing host to link to! Please provide :host parameter or set default_url_options[:host] 

Dans l’environnement de test et de développement, j’ai la ligne suivante:

environnements / development.rb et environnements / test.rb

 config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

Je n’ai pas mis en place quelque chose dans l’environnement de production.

J’ai essayé de pousser avec

 config.action_mailer.default_url_options = { :host => 'mywebsitename.com' } config.action_mailer.default_url_options = { :host => 'heroku.mywebsitename.com' } 

mais ça ne marche pas trop ..

Je vois sur le web que cela pourrait être lié à ActionMailer mais je ne sais pas ce que je dois configurer. Merci beaucoup pour votre idée!

ÉDITÉ:

Salut,

Afin de ne pas faire planter mon application quand j’appuie sur heroku je mets ça dans mon env / test.rb et mon env / dev.rb (pas dans env.rb je pense que c’est parce que c’est une application rails 3)

 config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' } 

Mais quand j’ai essayé de créer un utilisateur dans la console heroku:

 User.create(:username => "test", :email => "test@test.com", :password => "test1234", :password_confirmation => "test1234", :confirmed_at => "2010-11-03 14:11:15.520128") 

voici les erreurs que j’ai eues:

 ActionView::Template::Error: Missing host to link to! Please provide :host parameter or set default_url_options[:host] /home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:473:in `url_for' /home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/url_for.rb:132:in `url_for' /home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_view/helpers/url_helper.rb:99:in `url_for' /home/slugs/.../mnt/.bundle/gems/ruby/1.8/gems/actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:195:in `user_confirmation_url' 

RÉVISÉ (2)

Quand je tape des logs de heroku sur la console, j’ai ce ==> production.log <== Donc, je pense que quand on se déploie sur heroku, c'est déjà en production.

Je configure le env / prod.rb comme ceci:

 config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' } 

et maintenant j’ai cette erreur quand j’essaie de créer un utilisateur:

 Errno::EAFNOSUPPORT: Address family not supported by protocol - socket(2) /usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `initialize' /usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `open' /usr/ruby1.8.7/lib/ruby/1.8/net/smtp.rb:551:in `do_start' /usr/ruby1.8.7/lib/ruby/1.8/timeout.rb:62:in `timeout' 

Vous devez append ceci à votre environment.rb

  config.action_mailer.default_url_options = { :host => 'localhost' } 

Assurez-vous de changer d’ host pour votre URL de production et conservez-le localhost pour le développement. Ceci est pour le mailer, il a besoin d’un email par défaut pour envoyer des avis tels que des confirmations, etc …


Vous devriez vérifier les journaux sur le serveur heroku logs exécutés à partir de la console et il vous indiquera l’erreur exacte.

Lorsque vous passez à heroku, vous devez configurer le fichier environment.rb avec le sous-domaine heroku:

 config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' } 

Selon la version, cela devrait aller dans production.rb , pas environment.rb .

D’accord,

Vous devez d’abord installer le joyau de sendgrid avec cette ligne de commande:

 heroku addons:add sendgrid:free 

Ensuite, il vous suffit de configurer votre env / dev.rb et env / prod.rb comme ceci:

env / dev.rb

 config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

env / prod.rb

 config.action_mailer.default_url_options = { :host => 'yourapp.heroku.com' } 

Poussez sur git et heroku. Ça devrait marcher ..

La réponse de Codeglot ci-dessus fait l’affaire, mais nous voulions quelque chose d’un peu plus flexible, alors nous avons fait ceci:

Sous Heroku, nous exécutons plusieurs environnements de production pour le stockage intermédiaire et les tests. Nous avons donc besoin d’une solution flexible pour le fichier d’environnement production.rb.

En production.rb

 config.action_mailer.default_url_options = { :host => ENV['MAILER_URL'] } 

Ensuite, définissez la variable d’environnement MAILER_URL pour votre application comme suit:

 heroku config:set MAILER_URL=my-awesome-app.herokuapp.com --app my-awesome-app 

Si vous utilisez Cedar :

  1. lancez les heroku addons:add sendgrid:free de votre console.

  2. Ajoutez les lignes suivantes à config/environments/production.rb dans votre application.

.

  ActionMailer::Base.smtp_settings = { :address => 'smtp.sendgrid.net', :port => '587', :authentication => :plain, :user_name => ENV['SENDGRID_USERNAME'], :password => ENV['SENDGRID_PASSWORD'], :domain => 'heroku.com' } ActionMailer::Base.delivery_method = :smtp config.action_mailer.default_url_options = { :host => 'YOUR-DOMAIN-HERE.COM' } 

J’ai dû faire un certain nombre de choses pour le faire fonctionner dans l’environnement de production : À l’intérieur de mon fichier production.rb (/config/environments/production.rb), j’ai ajouté ce qui suit:

 Rails.application.routes.default_url_options[:host] = 'myappsname.herokuapp.com' config.action_mailer.delivery_method = :smtp config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = false config.action_mailer.default :charset => "utf-8" 

Ceci est avec Rails 4 et Devise 3

Voici un truc à considérer. Cela facilitera le changement de serveur et d’environnement et changera de domaine comme dans un domaine personnalisé chez heroku.

Au lieu de coder en dur le nom d’hôte, lisez-le dans la requête. Voici un exemple d’une application simple que j’ai.

 class MyMailController < ApplicationController before_filter :set_host_from_request, only: [:create] .... private def set_host_from_request ActionMailer::Base.default_url_options = { host: request.host_with_port } end end 

Dans l'exemple simple, je n'ai qu'une seule action, créer, ce qui entraîne l'envoi de courriers électroniques. Vous pouvez append le paramètre before_filter dans application_controller.rb sans les excludes pour lui faire toujours stocker le nom d'hôte.

PRO:

  • toujours obtenir le nom d'hôte correct dans l'URL des emails que vous envoyez
  • La configuration des fichiers default_url_options sur notre serveur de transfert pour la production a entraîné l'envoi de courriers électroniques aux utilisateurs testant des liens vers la production (ils les ont bien sûr cliqués). Aucun dommage, mais très long.

CON:

sans les default_url_options que vous ne pouvez pas envoyer manuellement dans la console

 #config.action_mailer.default_url_options = { :host => 'mydomain.com' } $rails console User.invite!(email: "ceo@example.com") ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true ...stacktrace 

Si vous pouvez voir les inconvénients que je ne peux pas, s'il vous plaît partagez! Merci

Le travail après tant de recherches,

  1. N’oubliez pas d’append la valeur par défaut à partir de: adresse mail dans votre ApplicationMailer (application_mailer.rb) comme,

     class ApplicationMailer < ActionMailer::Base default from: 'yourmail@gmail.com' layout 'mailer' end 
  2. Ajoutez la configuration ci-dessous dans votre production.rb .

     config.action_mailer.default_url_options = { :host => 'yourapp.herokuapp.com' } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.gmail.com', port: 587, domain: 'heroku.com', user_name: 'yourmail@gmail.com', password: 'yourgmailpassword', authentication: 'login', enable_starttls_auto: true } 
  3. Activez IMAP à partir de vos parameters Gmail dans l'onglet Transfert IMAP / POP .

  4. Autoriser les applications moins sécurisées: sur https://myaccount.google.com/lesssecureapps

Vous êtes maintenant prêt à partir. 🙂