web-dev-qa-db-fra.com

Heroku / devise - Hôte manquant vers lequel se connecter! Veuillez fournir: Paramètre d'hôte ou définissez default_url_options [: Hôte]

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

Lorsque j'essaie d'ajouter un utilisateur avec la console heroku, j'ai l'erreur suivante:

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 lorsque j'appuie sur heroku, je mets ceci dans mon env/test.rb et mon env/dev.rb (pas dans env.rb, je pense que c'est parce que c'est un Rails 3 app)

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 => "[email protected]", :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'

ÉDITÉ (2)

Lorsque je tape les journaux heroku sur la console, je reçois ceci ==> production.log <== Je pense donc que lorsque l’on déploie sur heroku, il 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 ceci comme erreur quand j'essaye 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'
174
benoitr

Vous devez ajouter ceci à votre environment.rb

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

Assurez-vous de changer Host en votre URL de production et conservez-le localhost pour le développement. Ceci est destiné à l'expéditeur, 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 heroku logs lancez-le à partir de la console et il vous indiquera l'erreur exacte.

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

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

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

237
thenengah

D'accord,

Vous devez d’abord installer le gem 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 suit:

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' }

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

37
benoitr

La réponse de Codeglot ci-dessus fait le travail, mais nous voulions quelque chose d'un peu plus flexible, nous avons donc fait ceci:

Sur Heroku, nous exécutons plusieurs environnements de production pour la mise en scène 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'] }

Définissez ensuite 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
22
Ross

Si vous utilisez Cedar :

  1. courir heroku addons:add sendgrid:free depuis 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' }
18
Mike

Je devais faire un certain nombre de choses pour que cela fonctionne dans l'environnement production: À l'intérieur de mon production.rb fichier (/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

13
maudulus

Voici un truc à considérer. Il sera plus facile de changer de serveur et d’environnement, et de changer de domaine comme dans un domaine personnalisé chez heroku.

Au lieu de coder en dur le nom d'hôte, lisez-le à partir de la demande. 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 action, créer, qui entraîne l'envoi d'e-mails. Vous pouvez ajouter le before_filter dans application_controller.rb sans les exclus pour que le nom d'hôte soit toujours stocké.

PRO:

  • toujours obtenir le nom d'hôte correct dans l'URL des courriels que vous envoyez
  • Avoir les options default_url_options sur notre serveur de transfert configuré pour production, a abouti à l'envoi d'e-mails à des utilisateurs testant des liens vers la production (ils cliquent dessus, bien sûr). Aucun dommage, mais prend beaucoup de temps.

CON:

sans default_url_options, vous ne pouvez pas envoyer manuellement dans la console

#config.action_mailer.default_url_options = { :Host => 'mydomain.com' }
$Rails console
  User.invite!(email: "[email protected]")
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 voyez des inconvénients que je ne peux pas, merci de les partager! Merci

7
oma

Celui qui travaille après tant de recherches,

  1. N'oubliez pas d'ajouter l'adresse par défaut de: mail dans votre ApplicationMailer (application_mailer.rb) comme,

    class ApplicationMailer < ActionMailer::Base
      default from: '[email protected]'
      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:            '[email protected]',
      password:             'yourgmailpassword',
      authentication:       'login',
      enable_starttls_auto: true
    }
    
  3. Activez IMAP à partir de vos paramètres Gmail dans l’onglet Transfert d’IMAP/POP .

  4. Autoriser les applications moins sécurisées: ON à partir de https://myaccount.google.com/lesssecureapps

Vous êtes maintenant prêt à partir. :)

0
Anshab M K