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

ユーザーが招待メールを受け取り、パスワードを設定すれば、ユーザーはログインできるようになります。

空登録が必要なケースはあまりないかもしれませんが、参考になれば幸いです。