Twitter みたいなフォロー機能を実装するための Rails プラグイン『party_boy』

Twitter みたいなフォロー機能を実装中

自分で一から作ってもいいけど、GitHub をぶらついていたら party_boy っていう面白そうな gem を見つけたので、これを使ってみる。

party_boy のインストール

Gemfile に追加し、

gem "party_boy"

gem をインストール。

bundle

そしてジェネレーターを実行して、マイグレーションファイルとモデルを生成する。

bundle exec rails g party_boy

マイグレーション時の注意点

生成されたマイグレーションファイルの名前と、中のクラス名が違っているので、このままマイグレーションを実行すると失敗してしまう。

作成するテーブルは relationships なので、ファイル名を xxxxxxxxx_create_relationships.rb、クラス名を CreateRelationships に変更する。xxxxxxxx のところはタイムスタンプ。

変更したら

bundle exec rake db:migrate

を実行。これで無事テーブルを作成できた。

ユーザーをフォロー可能にしてみる

Devise で生成していた User クラスにフォロー機能を追加してみる。といっても書くコードはたった1行。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  # ↓追加
  acts_as_followable
end

これで User に follow、unfollow といったメソッドが追加される。

使いそうなメソッドを一通り試してみる

kagawa = User.find(1)
hodna = User.find(2)

# 他のユーザーをフォロー
kagawa.follow(honda)

# フォローしているかチェック
puts kagawa.following?(honda) #=> true

# フォローされているかチェック
puts honda.followed_by?(kagawa) #=> true

# フォローしているユーザーを取得
puts kagawa.following.count #=> 1

# フォローされているユーザーを取得
puts honda.followers.count #=> 1

# フォロー解除
kagawa.unfollow(honda)

まとめ

party_boy をインストールして、acts_as_followable の一行を書くだけで、モデルに簡単にフォロー機能を追加できた。あとはコントローラーとビューを修正するだけ。

小さいプラグインだから、コードの全体を把握するのも難しくない。万が一開発が止まっても、フォークして改良できそうだ。

SNS みたいなフレンド機能も実装できるみたいだけど、今回は使う予定ないから割愛。