【问题标题】:pass extra instance vars to devise_invitable email template将额外的实例变量传递给 devise_invitable 电子邮件模板
【发布时间】:2011-11-30 17:24:50
【问题描述】:

我正在覆盖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

【问题讨论】:

  • 您在更新中提供的解决方案有效。但是感觉不是很干净。我也喜欢更清洁的解决方案。一种方法可能是修补 devise_invitable 并重新定义 invite! 以接受更多选项。
  • @andrew-lank 请将您的更新提取到答案并接受它。

标签: ruby-on-rails-3 devise actionmailer


【解决方案1】:

有一种更简洁的方法可以实现您正在寻找的解决方案,那就是使用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。为此,我个人会在邮件程序中使用某种类型的查询(不干净,但它是封装的,因此不那么“神奇”)来检索这些对象。

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

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 2019-08-23
    • 2016-10-20
    • 2017-11-11
    • 2017-11-30
    • 2019-07-25
    • 2018-02-06
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多