Как мне настроить имя хоста для Rails ActionMailer? - PullRequest
20 голосов
/ 28 апреля 2009

Я работаю над довольно традиционным электронным письмом с забытым паролем - я хочу отправить пользователю по электронной почте токен изменения пароля, встроенный в ссылку, по которой он может щелкнуть, чтобы изменить свой пароль. Я пишу по электронной почте через традиционный 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, какое у нее имя хоста, без добавления моего собственного файла конфигурации, его анализа и т. Д.

Ответы [ 7 ]

36 голосов
/ 28 апреля 2009

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...')
26 голосов
/ 14 марта 2011

Вы, вероятно, также хотите установить: protocol => 'https', кстати.

config.action_mailer.default_url_options = { 
    :host => "portal.example.com", 
    :protocol => 'https' 
}
4 голосов
/ 22 апреля 2010

Существует другая альтернатива, как описано в http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

Преимущество этого решения в том, что оно не требует какой-либо настройки (а значит, меньше хлопот) и работает нормально, если вы отправляете электронные письма из контроллеров.

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

0 голосов
/ 26 февраля 2017

Интересно, что у меня была та же проблема, что и у вас, но в модульных тестах (при следовании руководству Майкла Хартла). У меня была эта строка в моем файле test.rb, но это не помогло:

config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' }

Я также добавил еще одну строку, подобную этой, в test.rb, и неожиданно это решило проблему

default_url_options = { host: 'example.com', protocol: 'http' }
0 голосов
/ 06 сентября 2012

Установка default_url_options напрямую устарела в Rails 3.1. Вместо этого используйте url_for .

Добавить параметр :protocol для переопределения значения по умолчанию (http), :protocol => 'https://'. Это создаст URL, начинающийся с "https: // ..." вместо значения по умолчанию "http://"

0 голосов
/ 19 января 2012

Установка default_url_options напрямую устарела в Rails 3.1

Используйте помощник url_for для его создания:

<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>
0 голосов
/ 28 апреля 2009

Можете ли вы просто сделать

<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>
...