Rails4でDevise invitableを使う

Rails4+Devise3.2.4で稼働している所にdevise invitableを加える

追加するGem

  • devise invitable 1.3.4

Gemfile.lock

      devise (3.2.4)
      bcrypt (~> 3.0)
      orm_adapter (~> 0.1)
      railties (>= 3.2.6, < 5)
      thread_safe (~> 0.1)
      warden (~> 1.2.3)
    devise_invitable (1.3.4)
      actionmailer (>= 3.2.6, < 5)
      devise (>= 3.2.0)

Gemがインストールされたら

$ rails generate devise_invitable:install

      insert  config/initializers/devise.rb
   identical  config/locales/devise_invitable.en.yml

invitation対象テーブル(User)へのほどこしを行う。
自動でUserモデルにinvitableを使うように追記してくれる
そしてmigrationファイルも作成してくれる

$ rails g devise_invitable user
      insert  app/models/user.rb
      invoke  active_record
      create    db/migrate/20140618122611_devise_invitable_add_to_users

できあがったmigrateファイルになぜか拡張子(.rb)がつかないので、つける。中身はこんなの。

20140618122611_devise_invitable_add_to_users.rb
class DeviseInvitableAddToUsers < ActiveRecord::Migration
  def up
    change_table :users do |t|
      t.string     :invitation_token
      t.datetime   :invitation_created_at
      t.datetime   :invitation_sent_at
      t.datetime   :invitation_accepted_at
      t.integer    :invitation_limit
      t.references :invited_by, :polymorphic => true
      t.integer    :invitations_count, default: 0
      t.index      :invitations_count
      t.index      :invitation_token, :unique => true # for invitable
      t.index      :invited_by_id
    end

    # And allow null encrypted_password and password_salt:
    change_column_null :users, :encrypted_password, true
  end

  def down
    change_table :users do |t|
      t.remove_references :invited_by, :polymorphic => true
      t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at
    end
  end
end

Userモデルのdeviseに:invitableが追加された事を確認。

user.rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable, :timeoutable, :omniauthable
(以下略)

migrateをかける(developmentでやっているのでRAILS_ENVを指定)

$ rake db:migrate RAILS_ENV=development

テンプレートを変更するのでデフォルトをコピーしてくる

$ rails generate devise_invitable:views users

      invoke  DeviseInvitable::Generators::MailerViewsGenerator
       exist    app/views/users/mailer
   identical    app/views/users/mailer/invitation_instructions.html.erb
      invoke  form_for
      create    app/views/users/invitations
      create    app/views/users/invitations/edit.html.erb
      create    app/views/users/invitations/new.html.erb

変更したい部分があったのでコントローラーも作る

class Users::InvitationsController < Devise::InvitationsController

(処理)

end

追加した自前のコントローラーを使うように、sevise_forのrouteに:invitations追加

(略)
ActiveAdmin.routes(self)
  devise_for :users, :controllers => {
      (略)
      :invitations => 'users/invitations'
  }
(略)