【Rails6】deviseで会員登録時に乱数(ランダムな文字列)を生成

deviseで会員登録時に乱数(ランダムな文字列)を生成

deviseで会員登録時に乱数(ランダムな文字列)を生成する方法をまとめる。

会員IDだと、最初の方の人は、数字が一桁や二桁になってしまい、なんか違和感があるw

作業環境(バージョン)

  • ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin19]
  • Rails 6.0.3.2

public_uid gemをインストール

データをDBに登録するときに、ランダムな文字列を生成してくれるgemです。

デフォルトだとHexString(16進数)で生成されます。

https://github.com/equivalent/public_uid

gem 'public_uid'
$ bundle install

今回は、deviseに実装するので、Userモデルを使用する前提で進めていきます。

public_uidカラムを追加

Userモデルにカラム を追加します。

Userモデルがすでに存在する場合

$ rails g migration AddColumnPublicUidToUsers public_uid:string

マイグレーションファイルに検索性能をあげるためにpublic_uidへのindexをはります。

class AddColumnPublicUidToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :public_uid, :string
    add_index  :users, :public_uid, unique: true
  end
end
$ rails db:migrate

Userモデルにpublic_uidを自動生成するコードを付与

Userモデルファイル(/app/models/user.rb)にgenerate_public_uidというコードを1行追加するだけです。

これによってモデルがDBに登録されるタイミングで自動的にpublic_uidに8桁のランダムな文字列が付与されるようになります。

class User < ApplicationRecord
  generate_public_uid
end

Viewsに表示させる

あなたのID:<%= current_user.public_uid %>

これでブラウザ側にランダムに生成した文字列を表示できます。

ランダムな文字列でなくランダムな数字にしたい

/app/models/user.rbにお好みで追記。

public_uid gemでは、ランダムな数字を生成する仕組みとして、NumberRandomNumberSecureRandomという設定を用意してくれています。

generate_public_uidgeneratorを指定してあげるだけです。

class User < ApplicationRecord
  # NumberRandomの場合
  generate_public_uid generator: PublicUid::Generators::NumberRandom.new
  # Number SecureRandomの場合
  generate_public_uid generator: PublicUid::Generators::NumberSecureRandom.new
end

public_uidの文字数を指定する

8文字だとすぐ枯渇しかねないモデルの場合はpublic_uidの文字数を増やしたくなります。

この場合も、generatorで指定してあげるだけです。

例えば20文字を生成したい場合は以下の通りです。

class User < ApplicationRecord
  generate_public_uid generator: PublicUid::Generators::HexStringSecureRandom.new(20)
end

active adminにカラムを追加

管理者にも管理して欲しいので、今回の場合は、active adminに生成した乱数が見れる様にします。

僕の場合は下記の様な感じになっていて、column "会員ID", :public_uidを追加しました。

index do
    column :id
    column "会員ID", :public_uid
    column "名前", :username
    column "メースアドレス", :email
    # column "パスワード", :password
    column "パスワード確認トークン", :confirmation_token
    column "パスワード確認時刻", :confirmed_at
    column "パスワード確認送信時刻", :confirmation_sent_at
    column "作成日時", :created_at
    # column :updated_at
    actions
  end

これで管理画面に新しく作成したユーザーには、反映されます。

なお、すでに登録済みのユーザーには乱数は生成されていません。