LoginSignup
4
2

More than 3 years have passed since last update.

Railsでいいね機能を実装する方法

Posted at

Railsでいいね機能を実装する方法をご紹介いたします。
完成系は以下のような感じです。
いいね1.gif

環境

  • Ruby 2.5.7
  • Rails 5.2.4

前提

  • deviseによるログイン機能が実装できていること
  • ユーザーのテーブルは"users"、記事のテーブルは"posts"、いいねの中間テーブルは"likes"とする。
  • postsのカラムはtitleを追加する

Likeモデルを追加

$ rails g model like user_id:integer post_id:integer

$ rails db:migrate

アソシエーションを設定

それぞれ以下を記述し、アソシエーションを設定します。

like.rb
  belongs_to :user
  belongs_to :post
user.rb
  has_many :likes, dependent: :destroy
post.rb
  has_many :likes, dependent: :destroy

ルーティングを設定する

routes.rb
  resources :posts, shallow: true do
    resources :likes, only: [:create, :destroy]
  end

liked_by?メソッドを作成

post.rb
  def liked_by?(user)
    likes.where(user_id: user.id).exists?
  end

controllerの記述

likes_controller.rb
  def create
    like = Like.new(user_id: current_user.id, post_id: params[:post_id])
    @post = like.post
    like.save
    redirect_back(fallback_location: posts_path)
  end

  def destroy
    like = Like.find(params[:id])
    @post = like.post
    like.destroy
    redirect_back(fallback_location: posts_path)
  end

Bootstrapを導入

Gemfile
gem 'bootstrap-sass', '~> 3.3.6'
gem 'jquery-rails'
$ bundle install

application.cssのファイル名をapplication.scssに変更する

$ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss

Bootstrapをscssに読み込ませる

application.scssの一番下に以下を記述

application.scss
@import "bootstrap-sprockets";
@import "bootstrap";

application.jsを編集する

application.jsの以下の部分を

application.js
//= require rails-ujs
//= require turbolinks
//= require_tree .

から

application.js
//= require rails-ujs
//= require jquery
//= require bootstrap-sprockets
//= require_tree .

に書き換えます。

index.html.erbを編集

index.html.erb
<div class="container">
  <h1>記事一覧</h1>
  <table class="table">
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.title %></td>
        <td>
          <% if post.liked_by?(current_user) %>
            <% like = Like.find_by(user_id: current_user.id, post_id: post.id) %>
            <%= link_to like_path(like), method: :delete do %>
              <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: red;">
              <span><%= post.likes.count %></span>
            <% end %>
          <% else %>
            <%= link_to post_likes_path(post), method: :post do %>
              <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: gray;">
              <span><%= post.likes.count %></span>
            <% end %>
          <% end %>
        </td>
      </tr>
    <% end %>
  </table>
</div>

これで完成です。

参考記事

4
2
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
4
2