Rails3 devise_invitableでDeviseにユーザ招待機能を追加する
Gemのインストール
RubyGemsにあるバージョンだと新しいdeviseだと使えませんので、ドキュメントの通りに古いdeviseを指定します。
gem 'devise', '~>1.2.0' gem 'devise_invitable', '~> 0.4.0'
$ bundle install
Gitのソースを直接指定すれば1.4でも使えます。
gem 'devise', '1.4.2' gem 'devise_invitable', :git => "https://github.com/scambra/devise_invitable.git"
$ bundle install
Deviseのセットアップ
前回の記事「Rails3アプリにDeviseで簡単に認証システムを組み込む」の「Railsプロジェクトにインストール」を参考にDeviseをインストールしてください。
devise_invitableのインストール
Wikiには、自動インストールと手動インストールの2通りが紹介されていますが、ここでは自動インストールを試しました。
$ rails generate devise_invitable:install insert config/initializers/devise.rb create config/locales/devise_invitable.en.yml
「rails generate devise_invitable MODEL」MODELのところを招待につかうモデル名に変えて実行します。
Userの場合は以下の通り
$ rails generate devise_invitable User insert app/models/user.rb invoke active_record create db/migrate/20110906110900_devise_invitable_add_to_users.rb
自動インストールで、実行される内容は、Wikiの「Manual installation」の節の通りです。
db:migrateします。
$ reke db:migrate
以上で、セットアップは終了です。
招待する
招待はUser.inviteメソッドを呼び出します。
User.invite!(:email => "new_user@example.com", :name => "John Doe")
この時、他の属性もハッシュで指定できます。
また、「/users/invitation/new」にアクセスするとデフォルトの招待ページが表示されます。
以降は、各種オプションの設定について解説します。
Deviseに追加される設定
- invite_for: 招待のトークンの有効期限を設定します。デフォルトは0です。
オプションはUserモデルに以下の用に追加します。
devise :invitable, :database_authenticatable, :registerable,:confirmable,
:recoverable, :rememberable, :trackable, :validatable, :invite_for => 2.weeks
- invitation_limit: 各ユーザが招待可能な人数のリミットを指定します。デフォルトはリミットなしです。
- invite_key: 招待を送ったユーザを識別するキー、デフォルトはメールアドレス。
- validate_on_invite: 「force a record to be valid before being actually invited.」招待する前にレコードを確認済みにしてしまう? 試してないのでなんとも。
- resend_invitation: 招待を再送できるかどうか。デフォルトは再送可能。
Viewのカスタマイズ
以下のコマンドで標準のビューをプロジェクトにコピーして編集します。
$ rails generate devise_invitable:views create app/views/devise/invitations create app/views/devise/invitations/edit.html.erb create app/views/devise/invitations/new.html.erb create app/views/devise/mailer create app/views/devise/mailer/invitation_instructions.html.erb
- invitations/edit.html.erb: コンファームメールのリンクをクリックして、accept処理の後に表示されるパスワード設定画面
- invitations/new.html.erb: 招待ページ
- mailer/invitation_instructions.html.erb: 招待メールの文面
メールのタイトルは以下のファイルにあります。(2011年11月15日追記)
- config/locales/devise_invitable.en.yml
Controllerのカスタマイズ
Devise::InvitationsControllerを継承したコントローラを作成し、routes.rbのdevise_forに指定します。
controller/usersに以下のクラスを作成した場合
class Users::InvitationsController < Devise::InvitationsController end
routes.rbは以下のように指定します。
devise_for :users, :controllers => { :invitations => 'users/invitations' }
独自のコントローラーを指定した場合は、パスが変わるので以下のコマンドでビューをコントローラに対応するパスにコピーします。
rails generate devise_invitable:views users