Где я могу разместить вспомогательные методы для представлений ActionMailer? - PullRequest
21 голосов
/ 10 сентября 2010

У меня есть метод, который берет массив строк и соединяет их, чтобы они выполняли что-то вроде этого:

>> my_arr
=> ["A", "B", "C"]
>> and_join(my_arr)
=> "A, B, and C"

К которому я хотел бы, чтобы у моей почтовой программы был доступ, чтобы я мог выводить некоторую информацию вэлектронное письмо.Я не могу найти хорошее место, чтобы положить его и положить его в файл application_helper.rb, и он не находит его там.Куда это должно идти?

Ответы [ 6 ]

62 голосов
/ 10 сентября 2010

Используйте метод helper в почтовой программе, чтобы определить вспомогательный класс для использования

# mailer_helper.rb
module MailerHelper
  def and_join(arr)
    # whatever …
  end
end

# my_mailer.rb
class MyMailer < ActionMailer::Base
  helper MailerHelper
  …
end

, тогда вы также можете использовать методы в представлениях.

10 голосов
/ 10 сентября 2010

Стоит посмотреть на метод расширения to_sentence для массивов, которые предоставляет rails.

5 голосов
/ 08 августа 2013

Уже отвеченный вопрос, но я не получил, где / что-файл изменить из других ответов SO.Вот как я это сделал:

В нижней части app / config / initializers / devise.rb вы можете добавить это:

Devise::Mailer.class_eval do
  helper :application # includes "ApplicationHelper"
end

Этот пример будет включать методы в / app /хелперы / application_helper.rb.Вместо этого вы можете включить другой вспомогательный файл - если, например, метод предназначен только для почтовой программы или используется только для одного другого контроллера.Необходимый мне def используется повсеместно, поэтому я вставил этот файл, чтобы все представления могли получить к нему доступ.

4 голосов
/ 21 июля 2011

+ 1, работал нормально, просто небольшая поправка:

Вы должны использовать модуль вместо class в файле помощника:

# mailer_helper.rb
module MailerHelper
  def and_join(arr)
    # whatever …
  end
end
1 голос
/ 19 октября 2017

В моем случае для Rails 5.1 мне пришлось использовать методы include и helper, например:

include ApplicationHelper
helper :application

А затем просто перейти к обычному использованию метода.

class MyMailer < ActionMailer::Base
  include ApplicationHelper
  helper :application

  def my_mailer_method
    my_helper_method_declared_in_application_helper
    ..
  end
end
0 голосов
/ 24 января 2019

Если у вас есть несколько методов, которые вы хотите использовать в представлении, вы можете использовать helper_method непосредственно в почтовой программе.

class MyMailer < ApplicationMailer
  def mailer
    mail to: '', subject: ''
  end

  private

  helper_method def something_to_use_in_the_view
  end
end

something_to_use_in_the_view будет доступно по вашему мнению.

...