Heroku / devise - отсутствует хост для ссылки на! Пожалуйста, предоставьте: параметр хоста или установите default_url_options [: хост] - PullRequest
174 голосов
/ 06 ноября 2010

Я пытаюсь запихнуть свое приложение на героку. Я все еще в разработке. Я использую устройство с подтверждающим модулем.

Когда я пытаюсь добавить пользователя с консоли heroku, я получаю эту ошибку:

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

в среде тестирования и разработки у меня есть следующая строка:

сред / development.rb и сред / 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, он уже работает. </p>

Я настраиваю 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'

Ответы [ 7 ]

236 голосов
/ 06 ноября 2010

Вы должны добавить это к своему environment.rb

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

. Убедитесь, что вы изменили host на свой рабочий URL-адрес и оставили его локальным для разработки.Это для почтовой программы, для отправки уведомлений, таких как подтверждения и т. Д., Требуется электронное письмо по умолчанию ...


Вы должны проверить журналы на сервере heroku heroku logs, запустить его из консоли исообщит вам точную ошибку.

Когда вы нажимаете на heroku, вам нужно настроить файл environment.rb с поддоменом heroku:

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

В зависимости от версии это должновведите production.rb, а не environment.rb.

37 голосов
/ 07 ноября 2010

Хорошо,

Сначала вы должны установить гем sendgrid с помощью следующей командной строки:

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

Нажимаем на мерзавца и героку. Это должно работать ..

22 голосов
/ 21 сентября 2012

Ответчик Codeglot выше делает свою работу, но мы хотели что-то более гибкое, поэтому мы сделали это:

В Heroku для запуска и тестирования мы используем несколько производственных сред, поэтому нам нужно гибкое решение для файла среды production.rb.

В производстве.рб

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

Затем установите переменную среды MAILER_URL для своего приложения, например,

heroku config:set MAILER_URL=my-awesome-app.herokuapp.com --app my-awesome-app
18 голосов
/ 16 августа 2012

Если вы работаете на Кедр :

  1. запустите heroku addons:add sendgrid:free с консоли.

  2. Добавьте следующие строки в 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' }
13 голосов
/ 22 апреля 2014

Мне пришлось сделать несколько вещей, чтобы заставить его работать в среде production : Внутри моего файла 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"

Это с Рельсами 4 и Devise 3

7 голосов
/ 23 февраля 2012

Вот трюк для рассмотрения. Это облегчит переключение сервера и среды, а также изменение домена, как в пользовательском домене на 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

В простом примере у меня есть только одно действие create, которое приводит к отправке электронных писем. Вы можете добавить before_filter в application_controller.rb без исключений, чтобы он всегда сохранял имя хоста.

PRO:

  • всегда получает правильное имя хоста в URL отправляемых вами писем
  • Наличие default_url_options на нашем промежуточном сервере , настроенном для production , привело к отправке электронных писем тестовым пользователям со ссылками на production (они, конечно, щелкают по ним). Без повреждений, но очень много времени.

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

Если вы видите недостатки, которые я не могу, пожалуйста, поделитесь! Спасибо

0 голосов
/ 09 августа 2017

Рабочий после стольких исследований,

  1. Не забудьте добавить по умолчанию from: mail адрес в вашем ApplicationMailer (application_mailer.rb) as,

    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 в настройках Gmail на вкладке Пересылка IMAP / POP .

  4. Разрешить менее безопасные приложения: ON с https://myaccount.google.com/lesssecureapps

Теперь тебе пора.:)

...