将额外的实例变量传递给devise_invitable电子邮件模板

And*_*ank 15 actionmailer devise ruby-on-rails-3

我正在覆盖devise_invitable控制器,在我的创建方法中,我想将额外的值传递给invitations_instructions电子邮件模板.例如组名,有人在这方面取得了成功,如果是这样,请在这里给我一些线索.

我试过的......

@groupUsers::InvitesController < Devise::InvitationsController创建方法中的my 未在电子邮件模板中定义.

试图添加:skip_invitation => true我的创建,然后手动发送电子邮件,如...

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

但这会给出错误的参数数量,所以我无法从文档中正确阅读.

更新 - 可能的解决方案

唯一的方法似乎是这个,但我很好奇是否有更好的方法使用提供的模板和设计邮件

在我/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
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

Gav*_*ler 3

有一种更简洁的方法来实现您正在寻找的解决方案,那就是使用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
Run Code Online (Sandbox Code Playgroud)

然后,在 中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
Run Code Online (Sandbox Code Playgroud)

您的示例的主要症结在于传递额外的数据来设置@group/@object。为此,我个人会在邮件程序中使用某种类型的查询(不干净,但它是封装的,因此不那么“神奇”)来检索这些对象。

此外,如果您想使用自定义电子邮件模板而不是 devise 的电子邮件模板,您只需将它们添加到目录中app/views/my_mailer/,devise 就会优先选择该目录中的电子邮件而不是来自 gem 的电子邮件。