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

时间:2011-10-04 13:47:41

标签: ruby-on-rails-3 devise 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 个答案:

答案 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的电子邮件。