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