Подтвердить что ты не робот

Доступ к помощникам от почтовой программы?

Я пытаюсь получить доступ к вспомогательным методам из почтовой программы rails 3, чтобы получить доступ к текущему пользователю для сеанса.

Я помещаю приложение helper: в мой почтовый класс, который, похоже, работает, за исключением того, что методы, определенные в нем, недоступны моей почтовой программе (я получаю ошибки undefined). Кто-нибудь знает, как это должно работать?

Здесь мой класс:

class CommentMailer < ActionMailer::Base
  default :from => "Andre Fournier <[email protected]>"

  helper :application
end

Спасибо, Шон

4b9b3361

Ответ 1

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

add_template_helper(ApplicationHelper)

К вашему ActionMailer (прямо под вашей строкой default :from).

Ответ 2

Используйте helper ApplicationHelper

class NotificationsMailer < ActionMailer::Base

  default from: "Community Point <[email protected]>"
  helper ApplicationHelper
  helper NotificationMailerHelper

  # ...other code...

ПРИМЕЧАНИЕ. Эти вспомогательные методы доступны только для представлений. Они недоступны в классе почтовой программы (NotificationMailer в моем примере).

Если вам нужны они в самом классе почтовой программы, используйте include ApplicationHelper, например:

class NotificationMailer < ActionMailer::Base

  include ApplicationHelper

  # ... the rest of your mailer class.

end

Из этот другой вопрос SO.

Ответ 3

Это очень старый вопрос, но я не вижу полного ответа, поэтому попробую, поскольку не нашел другого ресурса.

Это зависит от того, что вы делаете, с методами, которые были определены в вспомогательном модуле. Если они являются методами класса, и все, что не вызвано конкретным экземпляром, похоже, являются методами класса для 3.2.13, вам нужно использовать

extend ApplicationHelper

если методы экземпляра

include ApplicationHelper

и если вы хотите использовать их в режиме просмотра почты

helper ApplicationHelper

Ответ 4

Вы можете попробовать смешать в требуемом вспомогательном модуле:

class CommentMailer < ActionMailer::Base
  include ApplicationHelper
end

Ответ 5

Ответ Josh Pinter правильный, но я обнаружил, что это не обязательно.

Что нужно - правильно указать помощника.

NotificationMailerHelper является правильным. NotificationMailersHelper (примечание s) неверно.

Класс и имя файла помощника должны совпадать и быть правильно написаны.

Rails 3.2.2

Ответ 6

include ActionView::Helpers::TextHelper работал у меня в контроллере Mailer (файл .rb). Это позволило мне использовать помощник pluralize в действии контроллера Mailer (помощники отлично работали от просмотра в представлениях Mailer). Ни один из других ответов не работал, по крайней мере, не на Rails 4.2

Ответ 7

Если вы хотите вызвать вспомогательный метод из ActionMailer, вам нужно включить вспомогательный модуль (модуль) в файл Mailer, как если бы имя модуля Helper было "UserHelper", тогда вам нужно записать следующее в файле Mailer

class CommentMailer < ActionMailer::Base
    default :from => "Andre Fournier <[email protected]>"
    add_template_helper(UserHelper)
end

или

class CommentMailer < ActionMailer::Base
    default :from => "Andre Fournier <[email protected]>"
    include UserHelper
end

Надеюсь, что это будет полезно.

Ответ 8

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

class CommentMailer < ActionMailer::Base
  default :from => "Andre Fournier <[email protected]>"

  def blog_comment(user)
    @recipients                   = user.email
    @from                         = "[email protected]"
    @sent_on                      = Time.now
    @timestamp                    = Time.now
    @user                         = user
  end
end

С приведенным выше, @user, а также все другие переменные экземпляра доступны из представлений почтовой программы. /views/comment _mailer/blog_comment.html.erb и./views/comment_mailer/blog_comment.text.erb

В отдельности вы можете создать помощник под названием

comment_mailer_helper.rb

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

Ответ 9

В ActionMailer также работает одна версия метода продвижения метода к тому, чтобы быть помощником, доступным в ApplicationController:

class ApplicationMailer < ActionMailer::Base
  helper_method :marketing_host

  def marketing_host
    "marketing.yoursite.com"
  end
end

оттуда вы можете вызывать marketing_host из любого из ваших почтовых просмотров

Ответ 10

Ни один из помощников *_path не доступен по умолчанию внутри электронной почты. Вместо этого необходимо использовать форму *_url желаемого помощника. Так, например, вместо использования user_path(@user) необходимо использовать user_url(@user). См. Основы действий Майер.

Ответ 11

Существенное средство достижения того, что я хочу, - это хранить нужные мне объекты (current_user.name + current_user.email) в атрибутах потока, например: Thread.current[:name] = current_user.name. Затем в моей почтовой программе я просто назначил новые переменные экземпляра тем значениям, которые хранятся в потоке: @name = Thread.current[:name]. Это работает, но это не сработает, если вы используете что-то вроде отложенной работы.