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