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
変更したい部分があったのでコントローラーも作る
controllers/users/invitations_controller.rb
class Users::InvitationsController < Devise::InvitationsController
(処理)
end
追加した自前のコントローラーを使うように、sevise_forのrouteに:invitations追加 congfig/routes.rb
(略)
ActiveAdmin.routes(self)
devise_for :users, :controllers => {
(略)
:invitations => 'users/invitations'
}
(略)