передать дополнительные экземпляры в шаблон электронной почты devise_invitable - PullRequest
15 голосов
/ 04 октября 2011

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

что я пробовал ...

мой @group в моем Users::InvitesController < Devise::InvitationsControllerМетод создания не определен в шаблоне электронной почты.

попытался добавить :skip_invitation => true в моем создании, а затем отправить письмо вручную, как ...

self.resource = resource_class.invite!(params[resource_name], current_inviter, :skip_invitation => true)
 ::Devise.mailer.invitation_instructions(self.resource).deliver

, но это дает неправильное числоаргументы, поэтому есть кое-что, что я не правильно читаю из документации.

ОБНОВЛЕНИЕ - возможное решение

Единственный способ, по-видимому, таков, но мне любопытно, если есть лучший способкоторый использует предоставленные шаблоны и разрабатывает mailer

в моем /app/controller/users/InvitesController#create (наследует от InvitationsController)

self.resource = resource_class.invite!(params[resource_name], current_inviter) do |u|
  u.skip_invitation = true
end
UserMailer.invitation_instructions(self.resource, current_inviter, @object).deliver

, где UserMailer - мой общий (стандартный) почтовик действий и что-то идеткак ...

def invitation_instructions(resource, inviter, object)
    @resource = resource
    @object = object
    @inviter = inviter

    mail(:to => resource.email, :subject => 'New invitation from ' + inviter.first_name)
  end

1 Ответ

2 голосов
/ 12 июля 2015

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

Сначала создайте пользовательскую почтовую программу, которая начинается с Devise::Mailer:

class MyMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.
  include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
  default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views
end

Затем в config/initializers/devise.rb установите config.mailer на "MyMailer". Это позволит вам переопределить ЛЮБУЮ электронную почту, которую разработчик отправляет и настраивает по своему вкусу.

Тогда вы можете переопределить invitable_instructions следующим образом:

def invitation_instructions(record, token, opts={})
  # Determine a way to set object -- likely through a query of some type
  @object = get_object_for(record)

  opts[:subject] = 'New invitation from ' + inviter.first_name

  super
end

Основным камнем преткновения в вашем примере была передача дополнительных данных для установки @group/@object. Чтобы сделать это, я лично пошел бы с каким-то типом запроса в почтовой программе (не чистый, но он инкапсулирован и, следовательно, менее "магический"), чтобы получить эти объекты.

Кроме того, если вы хотите использовать пользовательские шаблоны электронной почты вместо devise, вы можете просто добавить их в каталог app/views/my_mailer/, и devise предпочтет электронные письма в этом каталоге вместо электронных писем из драгоценного камня.

...