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
では、ランダムな数字を生成する仕組みとして、NumberRandom
とNumberSecureRandom
という設定を用意してくれています。
generate_public_uid
にgenerator
を指定してあげるだけです。
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
これで管理画面に新しく作成したユーザーには、反映されます。
なお、すでに登録済みのユーザーには乱数は生成されていません。