Как мне настроить имя хоста для Rails ActionMailer?
-
18-09-2019 - |
Вопрос
Я работаю над довольно традиционным электронным письмом с забытым паролем - я хочу отправить пользователю по электронной почте токен смены пароля, встроенный в ссылку, по которой он может щелкнуть, чтобы изменить свой пароль.Я пишу по электронной почте через традиционный ActionMailer.
Если я использую обычный тег link_to
<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>
Я получаю относительную ссылку - довольно бесполезную по электронной почте.
Если я добавлю
:only_path => false
, затем появляется ошибка, говорящая, что мне нужно установить default_url_options[:host]
.Документы ActionController подразумевают, что вы делаете это, переопределив методы #default_url_options в вашем контроллере.Конечно, есть опция конфигурации, позволяющая сообщить Rails, какое у него имя хоста, без добавления моего собственного файла конфигурации, его анализа и т. д.?
Решение
default_url_options
доступен из config.action_mailer
и должен быть установлен в файле конфигурации вашей среды.
Например, в config/environments/production.rb
:
config.action_mailer.default_url_options = {
:host => 'www.yourdomain.com'
}
Для локального тестирования измените config/environments/development.rb
:
config.action_mailer.default_url_options = {
:host => '127.0.0.1',
:port => 3000
}
Затем, предположив, что у вас есть именованный маршрут с именем forgot_password_login
, вы можете сгенерировать URL-адрес ссылки для входа в свою почтовую программу, используя что-то вроде этого:
forgot_password_login_url(:token => 'a7s8q15sk2...')
Другие советы
Вы, вероятно, также захотите установить :protocol => 'https', кстати.
config.action_mailer.default_url_options = {
:host => "portal.example.com",
:protocol => 'https'
}
Есть еще один вариант, описанный в http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/
Преимущество этого решения состоит в том, что оно не требует какой-либо настройки (так что меньше хлопот) и работает нормально, пока вы отправляете электронные письма изнутри контроллеров.
Но если вы планируете отправлять электронную почту без использования контроллера (например,из командной строки или в ответ на другое электронное письмо), вам нужна статическая конфигурация.
Параметр default_url_options
напрямую устарел в Rails 3.1.Использовать url_for вместо.
Добавить параметр :protocol
чтобы переопределить значение по умолчанию (http), :protocol => 'https://'
.Это создаст URL-адрес, начинающийся с «https://...» вместо «http://» по умолчанию.
Интересно, что у меня была та же проблема, что и у вас, но в модульных тестах (следуя уроку Майкла Хартла).У меня была такая строка в файле test.rb, но это не помогло:
config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' }
Я также добавил еще одну подобную строку в test.rb, и на удивление это решило проблему.
default_url_options = { host: 'example.com', protocol: 'http' }
Установка default_url_options напрямую не рекомендуется в Rails 3.1.
Используйте помощник url_for, чтобы создать его:
<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>
Можешь просто сделать
<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>