передача дополнительных переменных экземпляра в шаблон электронной почты devise_invitable

#ruby-on-rails-3 #devise #actionmailer

#ruby-on-rails-3 #разработка #actionmailer

Вопрос:

Я переопределяю 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
  

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

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

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

в моем /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_invitable и переопределение invite! для принятия дополнительных опций.

2. @andrew-lank пожалуйста, извлеките ваше обновление в ответ и примите его.

Ответ №1:

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

Сначала создайте пользовательскую почтовую программу, которая расширяется от 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" . Это позволит вам переопределить ЛЮБОЕ электронное письмо, которое devise отправляет, и настроить его по своему вкусу.

Тогда для вас вы можете переопределить 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
  

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

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