2
1

More than 3 years have passed since last update.

いいね機能の作成(Ruby on Rails)

Last updated at Posted at 2020-07-24

プログラミングの勉強日記

2020年7月24日 Progate Lv.221
Ruby on RailsⅩ

Likeモデルの用意

 「どのユーザ」が「どの投稿」をいいねしたか記録するためにデータベースにuser_idpost_idの2つのカラムを持つlikesテーブルを用意する。コマンドを実行してLikeモデルとマイグレーションファイルを用意する。

ターミナル
$ rails generate model Like user_id:integer post_id:integer
$ rails db:migrate
models/likes.rb
class Like < ApplicationRecord
  validates :user_id,{presence: true}
  validates :post_id,{presence: true}
end

投稿にいいねしたかを表示する

 投稿詳細ページではログインしているユーザがその投稿にいいねしたデータという条件を満たす場合にいいね済みとする。

posts/show.html.erb
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
  <%#  いいね済みの処理 %>
<% else %>
  <%# いいねしていないときの処理 %>
<% end %>

いいねボタンの準備

 今までコントローラはrails generate controllerで自動作成していた。このコマンドで実行するとビューファイルも自動生成されるが、今回は必要ない。なので、今回はcontrollerフォルダ内にlikes_controller.rbというファイルを新規作成する。

likes_controller.rb
class LikeController < ApplicationController
  def create
  end
end
routes.rb
post "likes/:post_id/create" => "likes#create"

いいねボタンといいね取り消しボタンの作成

 いいねボタンはcreateアクション内で新たにデータを作成後、投稿詳細ページへとリダイレクトされる。いいね取り消しボタンはlikesコントローラにdestroyアクションを作成する。

likes_controller.rb
def create
  @like = Like.new(user_id: @current_user.id, post_id: params[:post_id])
  @like.save
  redirect_to("/posts/#{params[:post_id]}")
end

def destroy
  @like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id])
  @like.destroy
  redirect_to("/posts/#{params[:post_id]}")
end
routes.rb
post "likes/:post_id/create" => "likes#create"
post "likes/:post_id/destroy" => "likes#destroy"
posts/show.html.erb
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
  <%= link_to("いいね!済み", "/likes/#{@post.id}/destroy", {method: "post"}) %>
<% else %>
  <%= link_to("いいね!", "/likes/#{@post.id}/create", {method: "post"}) %>
<% end %>

いいねボタンをアイコンにする

 FontAwesomeを使う。layouts/application.html.erb<link>タグを追加して読み込む。link_formメソッド内にHTML要素を記述しても文字列として認識されてしまうため、表示されない。<%= link_to("URL") do %><% end %>の間にHTML要素を書くことでその部分をリンクにできる。

posts/show.html.erb
<%= link_to( "/likes/#{@post.id}/destroy", {method: "post"}) do %>
  <span class="fa fa-heart like-btn-unlike"></span>
<% end %>

いいね数の表示

 likesテーブルからデータ件数を取得するにはcountメソッドを使う。countメソッドは配列の要素数を取得するメソッドだが、テーブルのデータ数を取得するためにも利用できる。

ターミナル
$ rails console
 > Like.all.count
 => 3
 > Like.where(post_id:1).count
 => 2

0724.png

posts_controller.rb
def show 
  @like_count=Like.where(post_id: @post.id.count
end

いいねした投稿の表示

 あるユーザがいいねした投稿を一覧で表示する。(ユーザに関わるページなので、usersコントローラの中をいじる)いいねした投稿を一覧で表示するためにlikesアクションをusersコントローラ内に作成。

routes.rb
get "users/:id/likes" => "users#likes"
users_controller.rb
def likes
  @user=User.find_by(id: params[:id])
  @likes=Like.where(user_id: @user.id)
end
users/likes.html.erb
<% @likes.each do |like| %>
  <% post=Post.find_by(id: like.post_id) %>
<% end %>
2
1
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
2
1