実現したいユーザーの招待方法
- 登録した人だけがWikiに書き込みができる
- 1人目(インストールした人)は普通にユーザー登録できる
- 1人目の登録者は他者を招待するための秘密のURLを参照できるようになる
- 2人目以降は秘密のURLからのみ登録ができる
- 秘密のURLは破棄と再作成ができる
その他で検討したこと
- 1人目について
- インストールウィザードがあるのが望ましいが大変そうなので見送る
- usernameとpasswordが決め打ちなのも気持ち悪いので見送る
- 2人目以降の招待方法について
- 個別に招待メールを送る方法は嫌だった(scambra/devise_invitable)
- SNSのメッセンジャーなどで通知することを想定している
どうやったか
まず普通にdeviseを使ってユーザー管理の仕組みをつくる。
そして、Rails4でdeviseのControllerをカスタマイズする - Qiitaを参考にしながらUsers::RegistrationsController
のnew
とcreate
のアクションにbefore_filter
をかけて、そこでトークンがあるかどうかをチェックするようにした。
class Users::RegistrationsController < Devise::RegistrationsController
before_action :check_registable, only: [:new, :create]
protected
def check_registable
# 1人目のユーザーはトークン不要とした
return true if User.count == 0
#TOKEN is valid
token = params[:rt] || cookies[:rt]
if token == Option.user_registration_token # ※1
cookies[:rt] = token #クッキーに保存しておく(Sessionに保存してもいい)
else
redirect_to root_path, notice: 'invalid token'
end
end
end
※1Option.user_registration_token
に保存してある。Optionは設定を保存しているところである。(後で詳細を書くかもしれない)
Tokenは下記のように生成している。
class Option < ApplicationRecord
def self.update_registration_token
self.user_registration_token = SecureRandom.uuid.gsub!(/-/,'')
end
#省略
end
作った設定画面
まとめ
- 共通の招待URLを使った招待機能が実現できた。
- Deviseに乗っかることで比較的少ないコードで実現できた。
追記
だいたい作りました
https://github.com/toyoshi/wikigo