いいね!機能の実装

いいね!機能とは

  • いいね!とおもったblogをストックすることができる
  • だれがいいね!したかを見ることができる
  • どれくらいの人がいいね!したかを見ることができる

いいね!機能の要件

  • blogのindex、showページにいいね!ボタンを設置する
  • blogをいいね!したり解除したりできる
  • いいね!の数を表示
  • いいね!をしたuserの一覧ページ
  • 自分がいいね!をした一覧ページ

いいね!モデル

  • likeテーブルを中間テーブルとして、userモデルとblogモデルを多対多で関連付ける
  • likeテーブルはuser_idとblog_idを持つ
$ rails g model likes user_id:integer blog_id:integer
class CreateLikes < ActiveRecord::Migration[5.2]
  def change
    create_table :likes do |t|
      t.references :user, foreign_key: true
      t.references :blog, foreign_key: true

      t.timestamps
    end
  end
end
$ rails db:migrate
$ rails g rspec:system likes

(app/models/like.rb)

class Like < ApplicationRecord
  belongs_to :user
  belongs_to :blog
end
class User < ApplicationRecord
  has_many :likes, dependent: :destroy
  has_many :like_blogs, through: :likes, source: :blog
end
class Blog < ApplicationRecord
  has_many :likes, dependent: :destroy
  has_many :like_users, through: :likes, source: :user
end

コントローラ、ビュー

Rails.application.routes.draw do
  resources :likes, only: [:create, :destroy]
end

いいねのカウント

def show
  @like = current_user.likes.find_by(blog_id: @blog.id) if user_signed_in?
  @likes_count = Like.where(blog_id: @blog.id).count
end
<%= "いいねの数:#{@likes_count}" %>