はじめに
TwitterやInstagramでもユーザー名とは別でアプリ内IDがありますが、
そのイメージのやつを実装します。
自身のポートフォリオで実装しており、
当初は新規登録時にユーザーにて入力してもらっていましたが、
まずはランダムでアプリ内ID付与し、後から変更可能とするのが、
ユーザー目線かなぁ と感じ、後付けで実装しましたので、流れを記事にしました。
実装イメージ
- public_uid gemを使用
- Deviceでの新規登録時にアプリ内IDを自動付与
- 後からユーザー自身で変更可能
前提
- Rails5
- 既にUserテーブルはできている
参考にさせていただいた記事
実装
public_uid gemをインストール
データをDBに登録するときに、ランダムな文字列を生成してくれるgemです。
デフォルトだとHexString(16進数)で生成されます。
gem 'public_uid'
bundle install
public_uidカラムを追加
アプリ内IDのカラムをstring型でUserテーブルに追加します。
※カラム名は何でも大丈夫ですので、既にカラムがあるかたは飛ばしていただいてOKです。
rails g migration AddColumnPublicUidToUsers public_uid:string
rails db:migrate
Userモデルにpublic_uidを自動生成するコードを付与
class User < ApplicationRecord
#下記1行追記
generate_public_uid
end
なお、public_uidというカラム名であれば上記でOKですが、
別のカラム名にしている場合は下記追記してください。
class User < ApplicationRecord
generate_public_uid column: :カラム名
end
また、上記で参考記事で挙げていますが、
ここで文字数指定や数字だけにもできます。(デフォルトは8文字の英数字です。)
deviseで会員登録時に乱数(ランダムな文字列)を生成
ここまで完了すれば自動付与は完了です。
Userモデルにpublic_uidを自動生成するコードを付与
最後にユーザー自身で更新できるようにします。
そのため、バリデーションをかけたいですが、
普通にvalidates :unique_code, presence: true,を記載すると、
新規登録時に自動付与の前に引っ掛かってしまい進めません。
今回は更新時のみバリデーションをかけたいので、on: :updateを記述します。
下記に例を記載します。
class User < ApplicationRecord
generate_public_uid column: :カラム名
# 5-12文字の半角英数字(更新時のみのバリデーション※新規登録時には自動でランダム登録)
validates :unique_code, presence: true, on: :update
validates :unique_code, format: { with: /\A[a-z0-9]+\z/i }, on: :update
validates :unique_code, length: { minimum: 5, maximum: 12 }, on: :update
end
これで実装は完了です。
新規登録時にアプリ内IDを自動付与、
後からユーザーにて変更できるはずです。