1
3

More than 3 years have passed since last update.

【Rails】Deviceでのユーザー登録時に、ランダム尚且つユニークなアプリ内IDを自動付与&後からユーザー自身で変更可能にする。

Last updated at Posted at 2021-02-12

はじめに

TwitterやInstagramでもユーザー名とは別でアプリ内IDがありますが、
そのイメージのやつを実装します。

自身のポートフォリオで実装しており、
当初は新規登録時にユーザーにて入力してもらっていましたが、
まずはランダムでアプリ内ID付与し、後から変更可能とするのが、
ユーザー目線かなぁ と感じ、後付けで実装しましたので、流れを記事にしました。

実装イメージ

  • public_uid gemを使用
  • Deviceでの新規登録時にアプリ内IDを自動付与
  • 後からユーザー自身で変更可能

前提

  • Rails5
  • 既にUserテーブルはできている

参考にさせていただいた記事

実装

public_uid gemをインストール

データをDBに登録するときに、ランダムな文字列を生成してくれるgemです。
デフォルトだとHexString(16進数)で生成されます。

Gemfile
gem 'public_uid'
bundle install

public_uidカラムを追加

アプリ内IDのカラムをstring型でUserテーブルに追加します。
※カラム名は何でも大丈夫ですので、既にカラムがあるかたは飛ばしていただいてOKです。

rails g migration AddColumnPublicUidToUsers public_uid:string
rails db:migrate

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

/app/models/user.rb
class User < ApplicationRecord
#下記1行追記
  generate_public_uid
end

なお、public_uidというカラム名であれば上記でOKですが、
別のカラム名にしている場合は下記追記してください。

/app/models/user.rb
class User < ApplicationRecord
  generate_public_uid column: :カラム名
end

また、上記で参考記事で挙げていますが、
ここで文字数指定や数字だけにもできます。(デフォルトは8文字の英数字です。)
deviseで会員登録時に乱数(ランダムな文字列)を生成

ここまで完了すれば自動付与は完了です。

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

最後にユーザー自身で更新できるようにします。
そのため、バリデーションをかけたいですが、
普通にvalidates :unique_code, presence: true,を記載すると、
新規登録時に自動付与の前に引っ掛かってしまい進めません。
今回は更新時のみバリデーションをかけたいので、on: :updateを記述します。
下記に例を記載します。

/app/models/user.rb
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を自動付与、
後からユーザーにて変更できるはずです。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3