PIYO - Tech & Life -

deviseのskip confirmationの話

Railsのdeviseの話です。

deviseは使わない派、deviseは悪派な人も多いですが、deviseの標準的な範囲で使えそうならとりあえず使っちゃう派です。まあ、その辺の論争は置いといて。

(ユーザーを一括作成するなど)都合により認証メールを送らないでいるための方法と、認証メールとか関係なく認証済にしてしまう方法、それぞれ別の手段が提供されています。

コードをみれば一目瞭然ですが、こないだ開発中に「どっちだっけ?」となったので、メモっておこうかと思いました。

https://github.com/heartcombo/devise/blob/main/lib/devise/models/confirmable.rb

認証メールを送らない方法

こうです。

user = User.new(email: email)
user.skip_confirmation_notification!
user.save

中身的にはこうなってて、

def skip_confirmation_notification!
  @skip_confirmation_notification = true
end

フラグの状態でメールを制御します。↓このへん。

devise/confirmable.rb at main - heartcombo/devise

この方法だと認証メールは送られませんが、ユーザーは未認証のままです。あとから認証メールを送りたい場合はuser.send_confirmation_instructionsで送れます。

認証済にしてしまう方法

こうです。

user = User.new(email: email)
user.skip_confirmation!
user.save

中身はこうなってます。

def skip_confirmation!
  self.confirmed_at = Time.now.utc
end

confirmed_atに値をいれることで、認証済と判断されることになります。confirmedな場合には認証メールも送られません。

seedで初期データを作るときとか、管理者がユーザーを手動作成するようなケースではこっちを使うことが多い気がします。

メールアドレス変更時の再認証をスキップする方法

もう一つ似たメソッドがあって、skip_reconfirmation!というやつです。

user.email = new_email
user.skip_reconfirmation!
user.save

deviseのreconfirmableが有効な場合、メールアドレスを変更すると新しいアドレスに対して再度認証メールが送られます。これをスキップして即座にメールアドレスを変更したい場合に使います。

管理画面からメールアドレスを変更するような場面で地味に必要になるやつです。

整理

3つの違いを表にするとこんな感じ。

メソッド用途認証状態
skip_confirmation_notification!メールを送らない未認証のまま
skip_confirmation!認証済にする認証済になる
skip_reconfirmation!メアド変更時の再認証をスキップ認証済のまま