Вопрос

Я работаю над довольно традиционным электронным письмом с забытым паролем - я хочу отправить пользователю по электронной почте токен смены пароля, встроенный в ссылку, по которой он может щелкнуть, чтобы изменить свой пароль.Я пишу по электронной почте через традиционный 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 -%>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top