Rails: создание полного URL-адреса в представлении ActionMailer

Я использую ActionMailer для отправки электронного письма с подтверждением. Письмо должно содержать ссылку на сайт для проверки пользователя, но я не могу убедить Rails генерировать полный URL (включая домен и т.д.).

Я использую:

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

на мой взгляд

Часть b:

В режиме разработки Rails захватывает, если я не укажу хост-код в ссылке выше. Но я не хочу делать это на производстве. Любые решения?

Ответы

Ответ 1

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

Чтобы решить первую проблему, используйте именованные маршруты, если это применимо. Вместо

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

предполагая, что маршрут называется login, используйте

<%= login_url(:guid => @user.new_user.guid) %>

Заметьте, я использую login_url, а не login_path.

Ответ 2

Я не уверен, что это именно то, что вы хотите, но в config/environment/development.rb вы можете указать параметры по умолчанию для почтовых URL-адресов

config.action_mailer.default_url_options = {
  :host => "your.host.org",
  :port => 3000
}

вы можете сделать то же самое в config/environment/production.rb

Ответ 3

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

Перейдите к /config/environments и добавьте:

config.absolute_site_url = 'your site url'

для соответствующей среды (т.е. в development.rb, test.rb или production.rb). Перезапустите веб-сервер.

Это позволяет вам вызвать Rails.application.config.absolute_site_url, чтобы получить желаемый URL. Нет необходимости в плагинах или странном чите, просто сохраните URL-адрес сайта в качестве переменной приложения.

Ответ 4

Я думаю, что это не 100% правильный путь, но это также может быть решением:

См. раздел Использование хостов ресурсов в документации. Вам нужно указать asset_host. Вы также можете построить его динамически из цепочки запросов "#{request.protocol}#{request.host_with_port}/login/?guid=#{@user.new_user.guid}"