RailsのDeviseで空登録を行いたいことがあったため、備忘録も兼ねて残します。
Userモデルがあるとします。
今回の空登録は、管理者がUserを空登録し、後ほど必要に応じて該当のUserと実際のユーザーを紐づける(emailとパスワードを設定してもらう)ことができるようになります。
既にユーザー情報を持っているけど、emailは持ち合わせていない、だけど、Userモデルに登録して諸々処理を進めたい、ということができます。
整理すると
・ユーザーはDeviseで管理
・ユーザーには、emailとパスワードでログインさせる
・ユーザーのemail情報はないが、先にユーザーのemail以外の情報(名前や住所等)を登録して、管理したい
・emailを取得したら、ユーザーと紐づけたい
実装にあたっての大まかな流れは下記の通りです。
・管理者がinviteメソッドでユーザー登録
※メールアドレスは、ランダム英数字で作成し、invite時のメールを送らないようにする
・ユーザーのメールアドレスを入手後、管理者側でユーザー情報のemailカラムをアップデート
※confirmメールが飛ばないようにする
・inviteの再送を行なって、ユーザーへパスワード等の情報を登録してもらう
まず、Userモデルはinvitableとconfirmableができる状態とします。
※Userモデルにinvitableとconfirmable用のカラムがない場合は追加する必要あり
class User < ApplicationRecord
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :confirmable
end
空登録は、inviteを使用します。
def invite_no_mail
#仮のメールアドレスを作成
temp_email = loop do
random_email = SecureRandom.alphanumeric + "@domain.com"
break random_email unless User.exists?(email: random_email)
end
#skip_invitationで招待メールの送付を省略
user = User.invite!({ email: temp_email }) do |u|
u.skip_invitation= true
end
end
これで空登録完了です。
続いて、空登録したユーザーのemail情報が手に入った場合、ユーザーとemailを紐づけて、ユーザーへ招待メールを送ります。
def change_mail
user = User.find(hoge)
#skip_reconfirmation!でemail変更時のconfirmメールを省略
user.skip_reconfirmation!
user.update!(
email: "changed_email@mail.com"
)
#招待メールを送付
User._invite(email: user.email)
end
ユーザーが招待メールを受け取り、パスワードを設定すれば、ユーザーはログインできるようになります。
空登録が必要なケースはあまりないかもしれませんが、参考になれば幸いです。