LoginSignup
0
0

RailsのDeviseで複数のモデルを使っている際に、メールテンプレートをそれぞれで変更する方法

Posted at

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

RailsでDeviseを利用している際に、複数のモデルでDeviseを利用したいという場面があると思います。
例えば、一般ユーザーであるUserモデルと企業ユーザーであるCompanyモデルでDeviseを利用したいという場面です。

その際に、複数のモデルにDeviseを導入することはできますが、メールアドレス認証のメールのテンプレートを、それぞれのモデルごとに変更したいということがありました。

その際に、調べてみてもあまり情報が出てこなかったので備忘録としてまとめておきます。

この記事の構成としては以下のようになっています。

  1. Userモデルのメールテンプレートを設定する
  2. Comanyモデルのメールテンプレートを設定する

Userモデルのメールテンプレートのカスタマイズ方法

調べれば情報が多く出てきますので、詳細には記載しません。
以下の記事と同じ手順・設定で行いました。

Companyモデルのメールテンプレートのカスタマイズ方法

Userモデルのメールテンプレートのカスタマイズ設定を行うと、Companyモデルも同じメールテンプレートを利用されることになります。

というのも、以下の設定を行なってしまうと、Deviseから作られたモデルのメールテンプレートはUsers::Mailerが利用されることになるからです。

devise.rb
config.mailer = 'Users::Mailer'

そのため、Companyモデル内で以下のメソッドを定義すると、違うメールテンプレートクラスを利用することができるようになります。

company.rb
class Company < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable, :trackable, :timeoutable, :lockable

  # ここでメソッドを定義
  def devise_mailer
    Companies::Mailer
  end
end

これを記述するだけで、CompanyモデルではCompanies::Mailerのメールテンプレートを利用する設定になります。
あとはCompanies::Mailerを作る、Users::Mailerと同じ設定をすれば、モデルごとに違うメールテンプレートを利用することができます。

mailer.rb
class Companies::Mailer < Devise::Mailer
  helper :application
  include Devise::Controllers::UrlHelpers
  default template_path: 'devise/mailer'

  # メールアドレス変更の際の認証メール
  def confirmation_instructions(record, token, opts = {})
    opts[:subject] = "メールアドレス変更手続きを完了してください"
    super
  end

  # 新規登録の際の認証メール
  def confirmation_on_create_instructions(record, token, opts = {})
    opts[:subject] = "メールアドレス認証のお手続を完了してください"
    @token = token
    devise_mail(record, :confirmation_on_create_instructions, opts)
  end
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0