🐈
DeviseInvitableでユーザー招待機能を簡単に実装する
Deviseを使用しているRailsアプリにユーザー招待機能を実装できるDeviseInvitableを最近使ったのでその実装メモです。
DeviseInvitableの紹介
Deviseに対して、ユーザー招待機能を追加できるGemです。
招待の流れは以下のようになります。
- 管理者などがフォームか招待したいユーザーのEmailアドレスを入力して送信
- Emailアドレス宛に招待リンク付きのメールが届き、リンクをクリックするとパスワード設定フォームが開く
- フォームでパスワードを設定して送信するとログイン状態となる
前提
既に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は助かりました。
Discussion