Как включить полный путь в инструкцию Rails 3 link_to?
Я пытаюсь поместить инструкцию Rails link_to внутри электронной почты Mailer, которая включает полный путь (т.е. - http://localhost/contacts/id/confirm). Оператор link_to, который я пытаюсь, работает в моем стандартном представлении в /pages/options, но не в почтовом сообщении электронной почты.
Вот мой /pages/options Код контроллера:
class PagesController < ApplicationController
def options
end
end
И вот страницы/опции Просмотр:
<div>
<%= link_to "here", :controller => "contacts", :action => "confirm",
:only_path => false, :id => 17 %>
</div>
Когда я помещаю эту ссылку в следующую почтовую программу (welcome_email.html.rb), я получаю ошибку ниже. Любая помощь с этим будет принята с благодарностью.
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
</head>
<body>
<%= link_to "here", :controller => "contacts", :action => "confirm",
:only_path => false, :id => 17 %>
</body>
</html>
Сообщение об ошибке:
RuntimeError in Contacts#create
Showing C:/Documents and Settings/Corey Quillen/My Documents/Dev/Dev
Projects/my_project
Project/my_project/app/views/user_mailer/welcome_email.html.erb where line #7
raised:
Missing host to link to! Please provide :host parameter or set
default_url_options[:host]
Extracted source (around line #7):
4: <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5: </head>
6: <body>
7: <%= link_to "here", :controller => "contacts", :action => "confirm", :only_path
=> false, :id => 17 %>
8: </body>
9: </html>
Ответы
Ответ 1
Поскольку почтовые программы не запускаются внутри стека ответов, они не знают, из какого хоста они были вызваны: почему вы столкнулись с этой ошибкой. Легко исправить, изменить код на хост:
<%= link_to "here", :controller => "contacts", :action => "confirm",
:only_path => false, :id => 17, :host => "example.com" %>
Вы также можете установить хост по умолчанию для каждого приложения внутри вашего приложения .rb(или любой из ваших сред), указав это:
config.action_mailer.default_url_options = { :host => "example.com" }
Для полной документации по ActionMailer и почему эта проблема возникает, ознакомьтесь с документацией ActionMailer.
Ответ 2
Первый шаг:
#config/environments/production.rb
config.action_mailer.default_url_options = { :host => 'www.example.com' }
#config/environments/development.rb
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
Второй шаг:
<%= link_to "here", confirm_contacts_url(17) %>
Ответ 3
Основываясь на текущих руководствах http://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views, я думаю, что лучший способ - использовать url_for и настроить хост в файле конфигурации среды, Или еще лучше использовать маршрут имени.
Пример с указанным маршрутом
link_to @user.fullname, user_url(@user)
Ответ 4
Вам нужно указать опцию :host
с помощью link_to
.
Вы также можете установить config.action_mailer.default_url_options
в файлах config/environment/*. rb соответствующие настройки, чтобы они были выбраны для link_to во всех почтовых программах
eg -
в config/environment/production.rb
config.action_mailer.default_url_options = { :host => 'www.example.com' }
Ответ 5
Я думаю, вам нужно передать хост в фильтр перед тем, как использовать его в формате электронной почты. Я вспоминаю использование этой страницы, когда у меня была аналогичная проблема: http://www.cherpec.com/2009/06/missing-host-to-link-to-please-provide-host-parameter-or-set-default_url_optionshost/
Вот сообщение fooobar.com/questions/44656/... на нем тоже с другим выбором
Ответ 6
Если полный URL-адрес всегда совпадает с запросом пользователя, вы можете использовать камень actionmailer-with-request
для перенаправления запроса в почтовый ящик действия, тогда вы можете ссылаться на запрос в своем почтовом шаблоне, например:
<%= link_to "log into the admin page", request.base_url + admin_root_path %>