Ответ 1
В классе почтовой программы, который используется для управления вашими электронными сообщениями:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
Я хочу использовать методы, определенные в app/helpers/annotations_helper.rb
, в представлениях ReportMailer (app/views/report_mailer/usage_report.text.html.erb
). Как это сделать?
На основе это руководство кажется add_template_helper(helper_module)
может делать то, что я хочу, но я не могу понять, как его использовать.
(Кстати, есть ли причина, по которой вы получаете доступ к другому набору помощников в представлениях почтовой программы? Это довольно раздражает.)
В классе почтовой программы, который используется для управления вашими электронными сообщениями:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
В Rails 3 просто используйте вспомогательный метод в верхней части класса ActionMailer:
helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper
Я просто прошел в блоке, так как мне нужно только это в одном Mailer:
helper do
def host_url_for(url_path)
root_url.chop + url_path
end
end
(не забудьте установить config.action_mailer.default_url_options.)
(и если вы используете url_for, обязательно передайте: only_path = > false)
Для всех почтовых программ в Rails 3 (настройка "помощник приложения" ):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end
Для Ruby on Rails 4 мне пришлось сделать 2 вещи:
(1) Как Duke уже сказал, если помощник, который вы хотите добавить, например, UsersHelper
, затем добавьте
helper :users
к производному классу ActionMailer
(например, app/mailers/user_mailer.rb
)
(2) После этого у меня появилась новая ошибка:
ActionView::Template::Error (Missing host to link to! Please provide the :host
parameter, set default_url_options[:host], or set :only_path to true)
Чтобы исправить это, добавьте строку
config.action_mailer.default_url_options = { :host => 'localhost' }
для каждого из файлов config/environments/*.rb
. Для config/environments/production.rb
замените localhost
на более подходящий хост для генерируемых вспомогательными URL-адресами.
Q: Для # 2, почему почтовый ящик нуждается в этой информации, а регулярные представления - нет?
A: поскольку регулярные представления не нуждаются в знании host
, так как все созданные ссылки обслуживаются с хоста, к которому они обращаются. Ссылки, отображаемые в сообщениях электронной почты, не подаются с одного и того же хоста (если вы не связываетесь с hotmail.com
или gmail.com
и т.д.)
Вы можете просто добавить свою почтовую программу
helper :application
или любой необходимый помощник
в моем случае для Rails4, я делаю вот так:
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
add_template_helper ApplicationHelper
...
end
и
# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
def some_method(x, y)
end
end
так что вам не нужно указывать add_template_helper
всюду.