株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
RailsでDeviseを利用している際に、複数のモデルでDeviseを利用したいという場面があると思います。
例えば、一般ユーザーであるUserモデルと企業ユーザーであるCompanyモデルでDeviseを利用したいという場面です。
その際に、複数のモデルにDeviseを導入することはできますが、メールアドレス認証のメールのテンプレートを、それぞれのモデルごとに変更したいということがありました。
その際に、調べてみてもあまり情報が出てこなかったので備忘録としてまとめておきます。
この記事の構成としては以下のようになっています。
- Userモデルのメールテンプレートを設定する
- Comanyモデルのメールテンプレートを設定する
Userモデルのメールテンプレートのカスタマイズ方法
調べれば情報が多く出てきますので、詳細には記載しません。
以下の記事と同じ手順・設定で行いました。
Companyモデルのメールテンプレートのカスタマイズ方法
Userモデルのメールテンプレートのカスタマイズ設定を行うと、Companyモデルも同じメールテンプレートを利用されることになります。
というのも、以下の設定を行なってしまうと、Deviseから作られたモデルのメールテンプレートはUsers::Mailer
が利用されることになるからです。
config.mailer = 'Users::Mailer'
そのため、Companyモデル内で以下のメソッドを定義すると、違うメールテンプレートクラスを利用することができるようになります。
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
と同じ設定をすれば、モデルごとに違うメールテンプレートを利用することができます。
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