18
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails3.2でフォロー機能(party_boy)

Last updated at Posted at 2013-07-18

フォロー機能を実装してみたのでメモ。
自分で作ろうとも思ったけど「party_boy」というライブラリが良さげだったのでそれを利用してみた。

Gemfile

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

マイグレーションして、これで導入は完了。

Model

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 も忘れずに。

Controller

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なフォローボタンの出来上がりです。

下記を参考にしました。
mnelson/party_boy - GitHub
http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=164

↓ブログに書いたものの転載です。
Rails3.2でフォロー機能(party_boy) - rokuro Fire

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?