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 みたいなフレンド機能も実装できるみたいだけど、今回は使う予定ないから割愛。