Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

[Ruby on Rails]悪魔的に簡単なゲストログイン実装方法(ポートフォリオ作成)

はじめに

就職・転職用にポートフォリオを作成している人に向けて。

ポートフォリオ必須といわれているゲストログイン

  • メールアドレスとパスワードだけで新規登録できるように設計したからいらないと思っている人
  • 難しそうだから辞めておこうと思っている人

この方法はめちゃめちゃ簡単です。参考にしてください。
(ただしデメリットもあるので、あくまで参考程度に)

前提の環境

  • Ruby on Rails
  • gem deviseでのログイン機能実装

Userテーブルの中身は下記として説明します。

User
name string
email string
password string
created_at datetime
updated_at datetime

今回の実装イメージ

通常のログイン (1).jpg

きたない図でごめんなさい。
通常のログインでは利用者に情報を入力してもらい、そのデータをもとにUserを新しく作成しています。

それとは異なり今回のゲストログインはあらかじめ設定されたデータでUserを新しく作成します。
なので「ゲストログイン」より「簡単新規作成」の方が言葉的に近いかもしれません。

あらかじめデータを作成しておく必要があるのでdeviseで生成されるルーティングとコントローラは使用できません。
ゲストログイン用のものを自作していきます。

実装方法

1.ルーティングの設定

config/routes.rb
devise_for :users  # デバイスで生成されるルーティング

post '/guest_sign_in' => 'homes#guest' # 今回自作したルーティング

HTTPメソッドはpostで書きます。
URL・コントローラ・アクションは代替可能です。(今回はHomesコントローラのguestアクションで説明を続けます)

2.コントローラの設定

app/controllers/homes_controller.rb
  def guest
    user          = User.new(user_params)
    user.name     = "ゲストユーザー"
    user.email    = SecureRandom.alphanumeric(15) + "@email.com"
    user.password = SecureRandom.alphanumeric(10)
    user.save
    sign_in user
    redirect_to how_to_path
  end

  private

  def user_params
    params.permit(:name, :email, :password)
  end

ファットなコントローラかもしれないですが、見た目の分かりやすさ重視で書きました。

SecureRandom.alphanumeric(15)で15文字のランダムな英数字を自動で生成してくれます。
これだけだと「@がない」というバリデーションに引っかかるので、+@email.comを末尾につけています。


余談
deviseの一意性のバリデーションを考慮して今回は15桁で設定しました。
1桁で英(26文字)+数(10文字)=36通り。(英語の大文字小文字の区別は無しとして)
2桁で36x36=1,296通り
3桁で36x36x36=46,656通り


15桁で221,073,919,720,733,357,899,776通り(約2000垓通り)
2020年版の世界保健統計によると、全世界の総人口は約76億人なので
単純計算で全世界の人が1人約30兆回ゲストログインしてやっと一意性に引っかかることになります。
(米津玄師さんの代表曲「lemon」のYoutube再生回数が現時点で6.5億回なので、その4000倍以上です笑)
あくまでランダム生成なので単純計算はできませんが、10桁くらいでいいと思います。
余談終わり。

他にもありますので詳しくはRuby 3.0.0 リファレンスマニュアル を参照してください。

Userテーブルに他のカラムがあり、バリデーションを設定している場合は別途追加する必要があります。

例えば電話番号を設定している場合は、
user.tel = 09012345678のようにしてuser.saveより前に追加してください。
下のpermitに追加することも忘れずに。

データベースに保存後、ログイン状態にする必要があるのでdeviseの機能を借りてsign_in userとしリダイレクトさせます。

3.ビューの設定

最後にビューにゲストログイン用のリンクを作成して完成です。

<%= link_to 'ゲストログイン', '/guest_sign_in', method: :post %>

この方法のメリット・デメリット

メリット

  • 記述も少なく難しい技術も使っていないのですごく簡単

上記の場合15行だけ。難しい設定も理解が必要なメソッドもなし。

  • ゲストユーザーの情報を編集されても動作に影響ない

ここは大事。編集されないようにアクセス制限の設定したり、編集権限を考えたりする必要もない。

デメリット

  • ゲストログインした分だけUserが増える(データベース圧迫)

別途管理者ページを作って管理したほうが良いかも。(私は作成しています)

  • seedsでゲストログイン用のデータを作成することはできない

ゲストが投稿した記事等をあらかじめ作成しておくことはできないです。
ただ、他のユーザー投稿は問題なくseedsで作成できます。

私はデメリットの影響がないPFを制作する予定だったためこの方法で実装しました。
制作物によっては2つ目のデメリットが痛い場合があるので気を付けてください。

参考

簡単ログイン・ゲストログイン機能の実装方法(ポートフォリオ用)

他の方法を試す場合は、この方の記事がとても分かりやすいのでこちらを参考にしてみてください。
(私の方法とその1は似ていますが、若干違います。私が簡単新規作成なのに対し、この方はよりゲストログインに近い実装を紹介されています。お好みの方法で試してください。)

rised
「とびはねる」でしばらく戦っていましたが、最近「たいあたり」を覚えました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away