在我的应用程序中,我有用户和网站(例如用户和组织)。它们之间有一个查找表,称为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
感到困惑。如您在上面的代码中所看到的,如果我们系统中已经存在被邀请访问该网站的用户,我将使用我自己的邮件程序,并在其中传递site
和existing_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
我无法弄清楚如何通过设计邀请邮件来完成此任务,该邮件在系统中不存在用户时使用。
您所能提供的任何帮助将受到极大的赞赏!
答案 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