Як використовувати мої помічники щодо перегляду в моїх переглядах ActionMailer?


227

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

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

(BTW, чи є причина, коли ви отримуєте доступ до іншого набору помічників у режимах перегляду пошти? Це дуже дратує.)


Відповіді:


324

У класі електронної пошти, який ви використовуєте для керування електронними листами:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end

4
У цьому випадку для мене не працює (Rails 3.2.8): у мене є метод, визначений у ApplicationController, і зробити його помічником через helper_method: my_helper_wannabe, але метод "my_helper_wannabe" не доступний у пошті.
Джан Нгуен

Дивіться відповідь герцога нижче про те, як впоратися з рейками 3.
Кріс Петерс

Працює в рейках 3.2.11
січня

1
Я думав, що вони повинні бути автоматично включені до Rails 4? guides.rubyonrails.org/…
gabeodess

6
Це стародавня відповідь, але просто лунає, щоб сказати, що це спрацювало в Rails 5.2
Архонічний

158

У Rails 3 просто використовуйте helper метод у верхній частині класу 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
Це працює, але відчуває себе необхідним повторно вказати помічників, вже визначених у ApplicationController, до окремих класів ActionMailer. ActionMailer розширює ActionController, щоб вони походили із загальної ієрархії. Більше коментаря до Rails, ніж ваше рішення ...
robbie613,

3
А якщо помічник знаходиться у просторі імен, ви можете це зробитиhelper :'namespace/mail'
Джонатан Бетсон

якщо помічник знаходиться у просторі імен, він також приймає лише рядок (замість символу)helper 'namespace/mail'
Pwnrar

2
Працює на рейках 5.2!
RousseauAlexandre

28

Для всіх поштових повідомлень в Rails 3 (налаштування помічника "application"):

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

Найкраща відповідь для спільних електронних листів. Дякую!
Олексій Шеїн

2
НЕ вірно - helper :applicationпрацює чудово в Rails 4.2.1.
стейк-хаус

Добре працює навіть для власних шаблонів електронної пошти для devise. helper :applicationне працює в цьому випадку.
Свен Р.

1
не працює 4.2.5.1 - include ApplicationHelperзробив роботу
докірно

23

Для 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 потрібна ця інформація, а для звичайних переглядів - немає?

Відповідь: Оскільки звичайні представлення даних не повинні знати host, оскільки всі створені посилання подаються від хоста, на який вони посилаються. Посилання, що відображаються в електронних листах, не надходять від одного хоста (якщо ви не посилаєтесь на hotmail.comабо gmail.comтощо)


Як щодо складених імен? User::ComposedHelper
Кирило Духон-Доріс

20

Ви можете просто додати в пошту

helper :application

або будь-який помічник, який вам потрібен


4
це дублікат попередньої відповіді - @Shevaun
robbie613

1
Працює на рейках 5.2!
Руссо

17

(Це старе питання, але 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 у програмах / 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, шаблон електронної пошти в програмі / 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

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


5

у моєму випадку для 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всюди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.