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

Я установил 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 неправильно?

4 ответа

Решение

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

Унаследовать ваше приложение 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"s 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"s 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"}

Установка его динамически решила проблему.

  # 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

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

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

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

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

Другие вопросы по тегам