🐈

DeviseInvitableでユーザー招待機能を簡単に実装する

2 min read

Deviseを使用しているRailsアプリにユーザー招待機能を実装できるDeviseInvitableを最近使ったのでその実装メモです。

DeviseInvitableの紹介

Deviseに対して、ユーザー招待機能を追加できるGemです。

https://github.com/scambra/devise_invitable

招待の流れは以下のようになります。

  1. 管理者などがフォームか招待したいユーザーのEmailアドレスを入力して送信
  2. Emailアドレス宛に招待リンク付きのメールが届き、リンクをクリックするとパスワード設定フォームが開く
  3. フォームでパスワードを設定して送信するとログイン状態となる

前提

既にDeviseがインストールされているRailsアプリを想定しています。以下の環境で動作確認をしました。

  • Rails 6.1.4
  • Ruby 2.7.3
  • devise 4.8.0
  • devise_invitable 2.0.5

セットアップの流れ

Gemを追加

以下を追加して、bundle installします。

Gemfile
gem 'devise_invitable'

設定ファイル、カラム群を作成

下記を実行します。devise.rbに招待関係のオプションのコメントが入るのと、config/locales/devise_invitable.en.ymlが作成されます。日本語用の翻訳ファイルはこちらなどがそのまま使えると思います。

rails generate devise_invitable:install

続いて、DeviseInvitableをモデルに紐付けしていきます。

rails generate devise_invitable User # モデル名

Migrationファイルが作成されるので、rails db:migrateを実行しましょう。

Viewの作成

ユーザー招待用のViewファイルを作成します。この時作成されるViewは以下です。

  • app/views/devise/invitations/new.html.erb: ユーザー招待画面
  • app/views/devise/invitations/edit.html.erb: ユーザーがパスワードを設定する画面
rails generate devise_invitable:views

Controllerを設定

例えば管理者以外は招待を送れないようにしたい等の制御は、Devise::InvitationsControllerを継承するControllerを作成し、ルーティングの設定を加えれば実現できます。

app/controllers/users/invitations_controller.rb
class Users::InvitationsController < Devise::InvitationsController
  def update
    if some_condition
      redirect_to root_path
    else
      super
    end
  end
end
routes.rb
devise_for :users, controllers: { invitations: 'users/invitations' }

終わりに

過去に /admin 配下にユーザー作成用のControllerを作って強引にユーザー作成機能などを作ったことがあったのですが、これだとパスワードを招待する側が決めて伝える必要がありセキュリティ的に良くなかったので、このGemは助かりました。