Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

【Rails】Deviseに招待機能をつける

DeviseInvitable

「友人を招待」はもちろん,「サインアップ機能は除きたいけど新規ユーザ作成は必要」な場合(e.g. Adminの追加)を実現したい. ほぼRailsデファクトスタンダードとも言えそうなDevise gemであるが,そのままだとencrypted_passwordが必須だったりするのでちょっと厄介. そこでDeviseInvitable gemを利用すれば簡単に実装できる.

usage

ちょっとカラム増やしたりして…

def change
  add_column :users, :invitation_token, :string
  add_column :users, :invitation_created_at, :datetime
  add_column :users, :invitation_sent_at, :datetime
  add_column :users, :invitation_accepted_at, :datetime
  add_column :users, :invitation_limit, :integer
  add_column :users, :invited_by_id, :integer
  add_column :users, :invited_by_type, :string
  add_index :users, :invitation_token, unique: true
end

ちょっとnullをOKにしてみて…

def change
  change_column :users, :encrypted_password, :string, null: true
  change_column :users, :password_salt, :string, null: true
end

invitable moduleと有効期間(invite_for)を追加する.

class User < ActiveRecord::Base
  # 省略

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :invitable, invite_for: 2.weeks

  # 省略
end

おわり.

あとは招待メール送るためのviewとroutingが用意される(/invitations/new)ほか, 自前のView使いたいときは以下のようにするだけで招待メールが送信される.

User.invite!(email: 'izumin5210@example.com', name: 'Masayuki IZUMI')

i18nもちゃんと用意されてる.

en:
  devise:
    invitations:
      send_instructions: 'An invitation email has been sent to %{email}.'
      invitation_token_invalid: 'The invitation token provided is not valid!'
      updated: 'Your password was set successfully. You are now signed in.'
    mailer:
      invitation_instructions:
        subject: 'You got an invitation!'
        user_subject: 'You got a user invitation!'

らくちんで良い.


ゆくゆくはDeviseみたいな「gemを拡張するためのgem」が出てくる,かっちょいいgem作れるようになりたい.

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング