Подтвердить что ты не робот

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

4b9b3361

Ответ 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 -%>