#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.