フォロー機能を実装してみようと思うのでメモ。
自分で作ろうとも思ったけど「party_boy」というライブラリが良さげだったのでそれを利用してみた。
#Gemfile gem 'party_boy'
bundle install rails g party_boy
この時マイグレーションファイルが作成されるので、rake db:migrate したらエラーが出てほげぇ。
どうやら作成されたマイグレーションファイルのclass名が間違っているらしく、手動で修正しなきゃだめらしい。
# db/migrate/xxxxxxxxxxxxxx_create_relationship.rb # class名を "CreateRelationship" に変更 class CreateRelationship < ActiveRecord::Migration
マイグレーションして、これで導入は完了。
# app/models/user.rb # 追記 acts_as_followable
# app/models/relationship.rb
# 追記
attr_accessible :requestor, :requestee, :restricted
# バリデーションを追記
validate do
if requestor.id == requestee.id
return errors.add(:requestor)
end
end
requestor がフォローする人で、requestee がフォローされる人。
これらのidが一緒だった場合はエラーを返すようにする。これもライブラリ側でやってくれればいいのになーと。
attr_accessible の指定もデフォルトでは記述されていないので忘れずに。私はここで軽くハマりました・・・
下記でフォロー/フォロワーを取得。
# app/controllers/users_controller.rb # フォローしているユーザー @friendship[:follow] = @user.following # フォローされているユーザー @friendship[:follower] = @user.followers # フォローしているか調べる @user_a.following?(@user_b) # フォローされているか調べる @user_b.followed_by?(@user_a)
フォロー/アンフォローの動作。
# app/controllers/users_controller.rb
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なフォローボタンの出来上がりです。