Как использовать мои помощники в моих представлениях ActionMailer? - PullRequest
217 голосов
/ 13 сентября 2009

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

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

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

Ответы [ 7 ]

311 голосов
/ 14 сентября 2009

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

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end
156 голосов
/ 18 июня 2011

В Rails 3 просто используйте вспомогательный метод в верхней части вашего класса ActionMailer:

helper :mail   # loads app/helpers/mail_helper.rb & includes MailHelper

Я только что прошел в блоке, так как он мне нужен только в одном почтовике:

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)

28 голосов
/ 16 июля 2011

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

# config/application.rb:
...
config.to_prepare do
  ActionMailer::Base.helper "application"
end
23 голосов
/ 15 сентября 2014

Для Ruby on Rails 4 мне пришлось сделать 2 вещи:

(1) Как уже сказал Герцог , если помощник, которого вы хотите добавить, например, 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 и т. Д.)

19 голосов
/ 10 февраля 2013

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

helper :application

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

6 голосов
/ 08 августа 2018

(Это старый вопрос, но Rails эволюционировал, поэтому я делюсь тем, что работает для меня в Rails 5.2.)

Как правило, вы можете использовать пользовательский помощник вида при отображении строки темы письма, а также HTML. В случае, когда помощник вида находится в app / helpers / application_helper.rb следующим образом:

module ApplicationHelper

  def mydate(time, timezone)
    time.in_time_zone(timezone).strftime("%A %-d %B %Y")
  end

end

Я могу создать динамическую строку темы письма и шаблон, которые оба используют помощника, но мне нужно указать Rails явно использовать ApplicationHelper в apps / mailer / user_mailer.rb двумя способами, так как вы можно увидеть во второй и третьей строчках здесь:

class UserMailer < ApplicationMailer

  include ApplicationHelper  # This enables me to use mydate in the subject line
  helper :application  # This enables me to use mydate in the email template (party_thanks.html.erb)

  def party_thanks
    @party = params[:party]
    mail(to: 'user@domain.com',
    subject: "Thanks for coming on #{mydate(@party.created_at, @party.timezone)}")
  end

end

Я должен отметить, что эти две строки работают так же хорошо, поэтому выберите одну или другую:

helper :application

add_template_helper(ApplicationHelper)

FWIW, шаблон электронной почты на app / views / user_mailer / party_thanks.html.erb выглядит так:

<p>
  Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>

И app / controller / party_controller.rb контроллер выглядит так

class PartyController < ApplicationController
  ...
  def create
    ...
    UserMailer.with(party: @party).party_thanks.deliver_later
    ...
  end
end

Я должен согласиться с OP (@Tom Lehman) и @gabeodess, что все это выглядит довольно запутанно, учитывая https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers, поэтому, возможно, я что-то упускаю ...

5 голосов
/ 06 февраля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...