Как использовать мои помощники в представлении ActionMailer?

Я хочу использовать методы, определенные в app/helpers/annotations_helper.rb, в представлениях ReportMailer (app/views/report_mailer/usage_report.text.html.erb). Как это сделать?

На основе это руководство кажется add_template_helper(helper_module) может делать то, что я хочу, но я не могу понять, как его использовать.

(Кстати, есть ли причина, по которой вы получаете доступ к другому набору помощников в представлениях почтовой программы? Это довольно раздражает.)

Ответ 1

В классе почтовой программы, который используется для управления вашими электронными сообщениями:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end

Ответ 2

В 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)

Ответ 3

Для всех почтовых программ в Rails 3 (настройка "помощник приложения" ):

# config/application.rb:
...
config.to_prepare do
  ActionMailer::Base.helper "application"
end

Ответ 4

Для 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 и т.д.)

Ответ 5

Вы можете просто добавить свою почтовую программу

helper :application

или любой необходимый помощник

Ответ 6

в моем случае для 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 всюду.