"Отсутствует хост для ссылки!" для разработки

Я установил Devise, и все кажется, что они останавливаются, когда я пытаюсь создать учетную запись.

Полная ошибка:

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

У меня есть следующий код, сидящий внутри блока development.rb. Я пробовал его с и без добавления smtp-конфигураций.

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

Я неправильно определил host?

Ответ 1

Файлы в config/не будут автоматически перезагружены в процессе разработки. Если вы внесли изменения в этот файл, убедитесь, что вы перезапустили сервер Rails и все сеансы консоли Rails, чтобы изменения вступили в силу.

Ответ 2

Настройка динамического решения проблемы.

  # application_controller.rb
  before_filter :mailer_set_url_options

  ...

  def mailer_set_url_options
    ActionMailer::Base.default_url_options[:host] = request.host_with_port
  end

Я понимаю, что эта конфигурация не входит в контроллер по соглашению, но для целей развития это кажется достаточным. Я всегда могу вписать его в конфигурацию производственной среды.

Ответ 3

Добавить в конец файла config/environment.rb строка:

Rails.application.routes.default_url_options[:host] = 'yourhost.com'

Это не только проблема в action_mailer, но также и установка хоста по умолчанию для routes.

Ответ 4

Наследовать приложение default_url_options от ActionMailer.

По умолчанию параметр default_url_options, который вы установили для config.action_mailer в ваших файлах среды (development.rb, production.rb и т.д.), не используется в качестве default_url_options вашего Application в целом.

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {}

Итак, когда вы пытаетесь использовать все, что требует хоста и порта (например, url) вне почтовой программы, оно не знает, что делать.

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

Чтобы решить эту проблему (и как можно суровый), вы можете автоматически использовать config.action_mailer.default_url_options как весь Application default_url_options.

Просто добавьте следующую строку в ваш файл config/environment.rb (изменив MyApp на ваше имя приложения):

# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

Это исправит вашу проблему и автоматически установит ваш Application default_url_options таким же, как ваш config.action_mailer.default_url_options:

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}