2009-09-13 5 views
196

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

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

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

+0

аналогичный - http://amolnpujari.wordpress.com/2013/12/27/highlight-changes-being-made-on-activerecord-object-inside-mail/ –

ответ

287

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

class ReportMailer < ActionMailer::Base 
    add_template_helper(AnnotationsHelper) 

    ... 
end 
+6

Не работает для меня с Rails 3.2 , – Dogweather

+4

Не работает для меня в этом случае (Rails 3.2.8): У меня есть метод, определенный в ApplicationController, и сделайте его помощником helper_method: my_helper_wannabe, но метод «my_helper_wannabe» не станет доступен в почтовой программе. –

+0

См. Ниже ответ Дюка о том, как обращаться с Rails 3. –

148

в 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 => ложным)

+12

Существует незначительная коррекция вашего ответа. помощник: почты должно быть достаточно. –

+2

Спасибо, сатья. помощник: почта работает в Rails 3.2. – Dogweather

+2

Это работает, но чувствует, что он снова задает помощники, уже определенные в ApplicationController, для отдельных классов ActionMailer. ActionMailer расширяет ActionController, поэтому они исходят из общей иерархии. Больше комментариев к Rails, чем ваше решение ... – robbie613

29

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

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

Не работает для меня в Rails 3.2. – Dogweather

+0

Вы уверены? Все еще работаю для меня на Rails 3.2.8. –

+0

И он по-прежнему работает на меня на Rails 3.2.14 –

13

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

helper :application 

или любой другой помощник вам нужно

+4

Это дубликат более раннего ответа - @Shevaun – robbie613

21

Для 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-адресами.


Вопрос: Для № 2, почему почтовый ящик нуждается в этой информации, а обычные виды нет?

A: Поскольку обычные представления не обязательно знать host, так как все сгенерированные ссылки обслуживаются с узла, к которому они обращаются. Ссылки, отображаемые в электронных письмах, не подаются с одного и того же хоста (если вы не связываетесь с hotmail.com или gmail.com и т. Д.)

+0

Как насчет сложенных имен? 'User :: ComposedHelper' –

3

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

Смежные вопросы