Как настроить имя хоста для Rails ActionMailer?
Я работаю над довольно традиционным письмом с забытым паролем - я хочу отправить пользователю по электронной почте токен смены пароля, встроенный в ссылку, на которую они могут нажать, чтобы изменить свой пароль. Я отправляю сообщения по электронной почте через традиционный 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, что это имя хоста, не добавляя мой собственный файл конфигурации, разбор его и т.д.?
Ответы
Ответ 1
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...')
Ответ 2
Вероятно, вы хотите установить: protocol = > 'https', btw.
config.action_mailer.default_url_options = {
:host => "portal.example.com",
:protocol => 'https'
}
Ответ 3
Существует еще одна альтернатива, описанная в http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/
Это решение имеет то преимущество, что оно не требует какой-либо конфигурации (так меньше хлопот) и прекрасно работает, пока вы отправляете электронные письма из контроллеров.
Но если вы планируете отправлять электронную почту без прохождения через контроллер (например, из командной строки или в ответ на другое электронное письмо), вам нужна статическая конфигурация.
Ответ 4
Настройка default_url_options
напрямую устарела в Rails 3.1. Вместо этого используйте url_for.
Добавьте параметр :protocol
, чтобы переопределить значение по умолчанию (http), :protocol => 'https://'
. Это создаст URL-адрес, начинающийся с "https://..." вместо стандартного "http://"
Ответ 5
Интересно, что у меня была такая же проблема, как и у вас, но в модульных тестах (при следующем руководстве Michael Hartl). У меня была эта строка в файле test.rb, но это не помогло:
config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' }
Я также добавил еще одну строку, подобную этой, на test.rb, и на удивление это решило проблему
default_url_options = { host: 'example.com', protocol: 'http' }
Ответ 6
Настройка default_url_options напрямую устарела в Rails 3.1
Используйте помощник url_for для его создания:
<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>
Ответ 7
Можете ли вы просто сделать
<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>