Heroku / devise – 遗漏主机链接到! 请提供:host参数或设置default_url_options

我正在努力推动我的应用程序heroku。 我仍然在开发。 我使用可确认模块的devise。

当我尝试用heroku控制台添加一个用户时,我得到了这个错误:

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

在testing和开发环境中,我有以下行:

environments / development.rb和environments / test.rb

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

我没有在生产环境中设置一些东西。

我试图推动

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

但它不工作太..

我在网上看到它可能与ActionMailer有关,但我不知道我必须configuration什么。 非常感谢您的想法!

编辑:

嗨,

为了不让我的应用程序崩溃,当我推Heroku我把这个在我的env / test.rb和我的env / dev.rb(不env.rb我认为这是因为它是一个轨道3应用程序)

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

但是当我尝试在heroku控制台中创build一个用户时:

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

这里是我得到的错误:

 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' 

编辑(2)

当我在控制台上键入heroku日志时,我得到了这个==> production.log <==所以我想当一个在heroku上部署它已经在生产。

我像这样configurationenv / prod.rb:

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

现在,当我尝试创build一个用户时,我有这个错误:

 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' 

您需要将其添加到您的environment.rb

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

确保将host更改为生产url,并保留localhost以进行开发。 这是邮件,它需要一个默认的电子邮件发出通知,如确认等…


你应该检查在日志上运行的heroku服务器heroku logs从控制台,它会告诉你确切的错误。

当您推送到heroku时,您需要使用heroku子域configurationenvironment.rb文件:

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

根据版本,这应该在production.rb ,而不是environment.rb

好,

首先,您必须使用以下命令行安装sendgrid gem:

 heroku addons:add sendgrid:free 

那么你只需要像这样configuration你的env / dev.rb和env / prod.rb:

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

推git和heroku。 它应该工作..

上面的Codeglot的anwser做的工作,但我们想要更灵活一点,所以我们这样做:

在Heroku上,我们运行多个生产环境进行登台和testing,所以我们需要灵活的解决scheme来生产production.rb环境文件。

在production.rb

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

然后像这样为你的应用设置MAILER_URL环境variables

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

如果你在Cedar上运行:

  1. 运行heroku addons:add sendgrid:free从您的控制台。

  2. 将以config/environments/production.rb添加到您的应用程序中的config/environments/production.rb

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

我必须做很多事情才能使它在生产环境中工作:在我的production.rb文件(/config/environments/production.rb)内部,我添加了以下内容:

 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" 

这是Rails 4Devise 3

这是一个要考虑的技巧。 这将更容易切换服务器和环境,并在heroku中的自定义域中更改域。

不要对主机名进行硬编码,而是从请求中读取。 这里有一个简单的应用程序的例子。

 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 

在简单的例子中,我只有一个动作,创build,这导致电子邮件被发送。 您可以添加application_controller.rb中的before_filter而不包含排除项,以使其始终存储主机名。

PRO:

  • 始终在您发送的电子邮件的URL中获取正确的主机名
  • 在我们的configuration服务器上configurationdefault_url_options进行生产后 ,电子邮件被发送到testing用户链接到生产(当然他们点击)。 没有损坏,但非常耗时。

CON:

没有default_url_options你不能在控制台手动发送

 #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 

如果你能看到我不能的缺点,请分享! 谢谢

经过这么多的研究工作之后,

  1. 不要忘了在ApplicationMailer(application_mailer.rb)中添加默认的邮件地址

     class ApplicationMailer < ActionMailer::Base default from: 'yourmail@gmail.com' layout 'mailer' end 
  2. production.rb中添加以下configuration。

     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. 转发IMAP / POP标签中从Gmail设置启用IMAP。

  4. 允许安全性较低的应用:https://myaccount.google.com/lesssecureapps 开启

你现在很好去。 🙂