Railsのdeviseの話です。

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

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

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

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

こうです。

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

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

1def skip_confirmation_notification!
2  @skip_confirmation_notification = true
3end

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

devise/confirmable.rb at main - heartcombo/devise

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

認証済にしてしまう方法

こうです。

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

中身はこうなってます。

1def skip_confirmation!
2  self.confirmed_at = Time.now.utc
3end

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

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

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

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

1user.email = new_email
2user.skip_reconfirmation!
3user.save

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

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

整理

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

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