アカウト登録にDeviseのconfirmableモジュールを使かった場合、ユーザーに確認メールが送られ、そこに記載されたリンクをクリックしたら、アカウント登録完了となる機能を実装することができます。この方法とは別に本記事では、Deviseでアカウント登録はするが、シンプルに即アカウント登録完了とし、Welcomeメールのみ送る方法を実装してみました。
実装方法としてはDeviseのコントローラーは極力触らずに、Active Record コールバックの after_create を使っています。
環境はこちらです
1 2 3 4 |
ruby 2.5.1 rails 5.1.6 docker 18.06.0-ce devise 4.4.3 |
メーラークラスとメソッドを指定して、次のコマンドを入力します。
1 |
rails g mailer UserMailer user_welcome_mail |
メーラーメソッドの編集
UserMailerのuser_welcome_mailメソッド内に渡したい変数を定義します。
メソッドが呼ばれた後は、自動的に同名のviewsを読み込みます。
その他全メーラー共通の設定があればapplication_mailerに書きます。
app/mailers/user_mailer.rb
1 2 3 4 5 6 |
class UserMailer < ApplicationMailer def user_welcome_mail(user) @user = user mail(to: @user.email, subject: 'Welcome to Our Application!') end end |
メールテンプレートの作成
メールテンプレートはデフォルトで views/user_mailer/user_welcome_mail.html.erb と views/user_mailer/user_welcome_mail.text.erb の二種類の形式が提供されていますが、これは「 HTMLメールが送信できない場合にはテキストベースのメールを送信する 」といった動作を保証するためであるので、二種類とも作成しておくことが望まれます。
app/views/user_mailer/user_welcome_mail.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!doctype html> <html lang="ja"> <head> <meta content="text/html; charset=UTF-8" /> </head> <body> <div> <h1>ようこそ <%= @user.name %> 様</h1> <hr /> <p> この度はアカウント登録頂きましてありがとうございます。 </p> <p> ユーザー名: <%= @user.name %> </p> <p> メールアドレス: <%= @user.email %> </p> <hr /> </div> </body> </html> |
app/views/user_mailer/user_welcome_mail.text.erb
1 2 3 4 5 6 7 |
=============================== <%= @user.name %>様 =============================== この度はアカウント登録頂きましてありがとうございます。 ユーザー名: <%= @user.name %> メールアドレス: <%= @user.email %> |
Models
after_create コールバックを使うことで、Userが新規作成された後にメールを送信するためのメソッドを呼び出すことができます。
confirmableモジュールを使う場合:confirmableの記載をしますが、今回はしていません。
app/models/user.rb
1 2 3 4 5 6 7 8 9 10 11 |
class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable after_create :send_welcome_mail def send_welcome_mail UserMailer.user_welcome_mail(self).deliver end end |
メールサーバーの設定
開発環境のメールサーバの設定はGmailの場合です。
1 2 3 4 5 6 7 8 9 10 |
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :domain => "gmail.com", :user_name => 'example@gmail.com', :password => "****************", :authentication => :plain, :enable_starttls_auto => true } |
テストしてみてメールが届いたけど、引数が渡されなかったのですが、私の場合、configure_sign_up_paramsの設定を忘れていました!汗
app/controllers/users/registrations_controller.rb
1 2 3 4 5 6 7 8 9 |
class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] protected def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) end end |
以上です!ご覧いただきありがとうございました!!😆