Heroku / devise - 缺少链接的主机!请提供:host参数或设置default_url_options [:host]

时间:2010-11-06 19:40:54

标签: ruby-on-rails heroku devise actionmailer

我正在尝试在heroku上推送我的应用程序。我还在开发中。 我使用了可确认模块的设计。

当我尝试使用heroku控制台添加用户时出现此错误:

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

在测试和开发环境中,我有以下几行:

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有关,但我不知道我要配置什么。 非常感谢你的想法!

编辑:

嗨,

为了在推送heroku时不让我的应用程序崩溃,我把它放在我的env / test.rb和我的env / dev.rb(不在env.rb中,我认为这是因为它是一个rails 3应用程序)

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

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

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上部署它已经在生产中了。

我像这样配置env / prod.rb:

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

现在我尝试创建用户时出现此错误:

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'

6 个答案:

答案 0 :(得分:235)

您需要将此添加到environment.rb

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

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


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

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

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

具体取决于版本,应该在production.rb,而不是environment.rb

答案 1 :(得分:37)

好的,

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

heroku addons:add sendgrid:free

然后你只需要像这样配置你的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。它应该工作..

答案 2 :(得分:18)

如果您正在 Cedar 上运行

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

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

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

答案 3 :(得分:13)

我必须做很多事情才能让它在生产环境中运行: 在我的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 4 设计3

答案 4 :(得分:7)

这是一个需要考虑的技巧。它将更容易切换服务器和环境,并在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

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

PRO:

  • 始终在您发送的电子邮件的网址中获取正确的主机名
  • 生产配置了登台服务器的default_url_options后,会将电子邮件发送给测试用户,并提供生产链接(当然,他们会点击它们)。没有损坏,但非常耗时。

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

如果您能看到我无法解决的弊端,请分享!感谢

答案 5 :(得分:0)

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

  1. 请勿忘记在 ApplicationMailer(application_mailer.rb)中添加默认来自:mail 地址,

    class ApplicationMailer < ActionMailer::Base
      default from: 'yourmail@gmail.com'
      layout 'mailer'
    end
    
  2. 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. 通过转发IMAP / POP 标签中的Gmail设置启用IMAP。

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

  5. 你现在好了。 :)