覆盖 Devise Invitable `invite!` 方法以将附件添加到邀请电子邮件 - Rails

Override Devise Invitable `invite!` method in order to add attachment to invitation email - Rails

我有 devise_invitable gem 和一个邀请控制器 InvitationsController < Devise::InvitationsController。我从 gem.

使用此方法 User.invite!(user, inviter) 邀请我的用户

现在,我想在此邀请中添加 pdf 附件,但我无法覆盖邮件程序方法来执行以下操作:attachments['terms.pdf'] = File.read('/path/terms.pdf').

我的邀请电子邮件工作正常,我想保持原样,但带有附件。

这是我的 routes.rb:

devise_for :users, controllers: { invitations: 'api/v1/users/invitations' }

我错过了什么?

谢谢

Devise_Invitable 有一个有用的 skip_invitation 选项。 使用以下方法,您可以轻松地使用自己的邮件程序并在其中添加附件:

def invite_and_notify_user(email)
  user = User.invite!({ email: email }) do |u|
    u.skip_invitation = true
  end
  notify_by_email(user)
end


def notify_by_email(user)
  MyUserMailer.invited_user_email(user).deliver
end

在 UserMailer 中 class:

  def invited_user_email(user)
    @user = user
    attachments['terms.pdf'] = File.read('/path/terms.pdf')
    mail(to: user.email, from: 'contact@mail.com', subject: "Your subject")
  end

您可以像这样覆盖设计邮件程序...

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
  # If there is an object in your application that returns a contact email, you can use it as follows
  # Note that Devise passes a Devise::Mailer object to your proc, hence the parameter throwaway (*).
  default from: ->(*) { Class.instance.email_address }
end

然后您可以在 config/initializers/devise.rb 中将 config.mailer 设置为“MyMailer”。请注意,这会覆盖用于所有设计模块的邮件程序。

然后在 class 中将您的附件添加到 invited_user_instructions...

def invited_user_instructions(*args)
  attachments['terms.pdf'] = File.read('/path/terms/pdf')
  super
end

这是设计说明https://github.com/heartcombo/devise/wiki/How-To:-Use-custom-mailer