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! | メアド変更時の再認証をスキップ | 認証済のまま |