如何将额外的参数(组织名称)传递给“设计邀请”电子邮件

时间:2019-03-19 19:56:54

标签: ruby-on-rails devise devise-invitable

在我的应用程序中,我有用户和网站(例如用户和组织)。它们之间有一个查找表,称为SiteUser。在SiteUser中:

belongs_to :site

belongs_to :user

before_validation :set_user_id, if: ->() { email != nil }

def set_user_id existing_user = User.find_by(email: email) self.user = if existing_user.present? UserMailer.notify_existing_user(site, existing_user).deliver_now unless Rails.env.test? existing_user else User.invite!(email: email) end end

我需要生成的电子邮件主题包含站点名称。 “示例公司已邀请您加入他们的网站!”

在电子邮件正文中,我还需要网站标题。

我对如何将站点参数传递到devise invitable感到困惑。如您在上面的代码中所看到的,如果我们系统中已经存在被邀请访问该网站的用户,我将使用我自己的邮件程序,并在其中传递siteexisting_user,因此我可以在我的邮件视图中访问它。

class UserMailer < ApplicationMailer def notify_existing_user(site, user) @site = site @user = user mail to: @user.email, subject: "You've been given access to #{@site.title} in the Dashboard." end end

我无法弄清楚如何通过设计邀请邮件来完成此任务,该邮件在系统中不存在用户时使用。

您所能提供的任何帮助将受到极大的赞赏!

2 个答案:

答案 0 :(得分:1)

您始终可以覆盖devise的subject_for方法。在宝石问题上发现了这一点,这也暗示了另一种方式: https://github.com/scambra/devise_invitable/issues/660#issuecomment-277242853

希望这会有所帮助!

答案 1 :(得分:0)

我要完成此操作的方法是在名为invite_site_name的用户上添加一个临时/虚拟属性。因为问题是site不是User的属性,所以我无法将site发送到User.invite!

class User < ActiveRecord::Base
  attr_accessor :invite_site_name

然后在我的CustomDeviseMailer中可以访问它:

class CustomDeviseMailer < 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

  def invitation_instructions(record, token, opts={})
    opts[:subject] = "#{record.invite_site_name} has invited you to their Dashboard! Instructions inside!"

    super
  end
end