Пропустить дополнительные экземпляры экземпляров для шаблона devise_invitable

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

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

my @group в моем методе Users::InvitesController < Devise::InvitationsController create undefined в шаблоне электронной почты.

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

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

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

UPDATE - возможное решение

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

в моем /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

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

Сначала создайте настраиваемую почтовую программу, которая простирается от 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/, и разработчик предпочтет электронные письма в этом каталоге по электронной почте из драгоценного камня.