我覆盖了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
答案 0 :(得分:2)
有一种更简洁的方法来实现您正在寻找的解决方案,那就是使用Devise's own procedures for overriding mailer templates。
首先创建一个从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
。要做到这一点,我个人会在邮件程序中使用某种类型的查询(不是干净的,但它是封装的,因此不那么“神奇”)来检索这些对象。
此外,如果你想使用自定义电子邮件模板而不是设计,你可以简单地将它们添加到app/views/my_mailer/
目录中,设计将更喜欢该目录中的电子邮件,而不是来自gem的电子邮件。