フォロー機能を実装してみたのでメモ。
自分で作ろうとも思ったけど「party_boy」というライブラリが良さげだったのでそれを利用してみた。
Gemfile
gem 'party_boy'
bundle install。
rails g party_boy
この時マイグレーションファイルが作成されるので、rake db:migrate したらエラーがでてほげぇ。
どうやら作成されたマイグレーションファイルのclass名が間違っているらしく、手動で修正しなきゃだめらしい。
# class名を "CreateRelationship" に変更
class CreateRelationship < ActiveRecord::Migration
マイグレーションして、これで導入は完了。
Model
# 追記
acts_as_followable
# 追記
attr_accessible :requestor, :requestee, :restricted
# バリデーションを追記
validate do
if requestor.id == requestee.id
return errors.add(:requestor)
end
end
requestor がフォローする人で、requestee がフォローされる人。
これらのidが一緒だった場合はエラーを返すようにする。これもライブラリ側でやってくれればいいのになーと。attr_accessible も忘れずに。
Controller
# フォローしているユーザーを取得
@friendship[:follow] = @user.following
# フォローされているユーザーを取得
@friendship[:follower] = @user.followers
# フォローしているか調べる
@user_a.following?(@user_b)
# フォローされているか調べる
@user_b.followed_by?(@user_a)
これでフォロー/フォロワーを取得
def action_follow
# ログインチェック
raise unless current_user
@user = User.find(params[:requestee_id])
# 既にフォローしているかチェック
if current_user.following?(@user)
render friend_unfollow(@user)
else
render friend_follow(@user)
end
rescue
render :json => {:result => "error" }, :status => 400
end
def friend_follow(user)
current_user.follow(user)
return { :json => { :type => "add", :result => "success" } }
rescue
return { :json => { :type => "add", :result => "error" } }
end
def friend_unfollow(user)
current_user.unfollow(user)
return { :json => { :type => "remove", :result => "success" } }
rescue
return { :json => { :type => "remove", :result => "error" } }
end
フォロー/アンフォローの動作。
前回のスター追加と同じで、1URLで実装したかったので、コントローラ内での分岐にしてみた。
あとはJSをうんぬんかんぬんすれば、twitterlikeなフォローボタンの出来上がりです。
下記を参考にしました。
mnelson/party_boy - GitHub
http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=164
↓ブログに書いたものの転載です。
Rails3.2でフォロー機能(party_boy) - rokuro Fire