#プログラミングの勉強日記
2020年7月24日 Progate Lv.221
Ruby on RailsⅩ
#Likeモデルの用意
「どのユーザ」が「どの投稿」をいいねしたか記録するためにデータベースにuser_id
とpost_id
の2つのカラムを持つlikesテーブルを用意する。コマンドを実行してLikeモデルとマイグレーションファイルを用意する。
$ rails generate model Like user_id:integer post_id:integer
$ rails db:migrate
class Like < ApplicationRecord
validates :user_id,{presence: true}
validates :post_id,{presence: true}
end
#投稿にいいねしたかを表示する
投稿詳細ページではログインしているユーザがその投稿にいいねしたデータという条件を満たす場合にいいね済みとする。
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
<%# いいね済みの処理 %>
<% else %>
<%# いいねしていないときの処理 %>
<% end %>
#いいねボタンの準備
今までコントローラはrails generate controller
で自動作成していた。このコマンドで実行するとビューファイルも自動生成されるが、今回は必要ない。なので、今回はcontrollerフォルダ内にlikes_controller.rb
というファイルを新規作成する。
class LikeController < ApplicationController
def create
end
end
post "likes/:post_id/create" => "likes#create"
#いいねボタンといいね取り消しボタンの作成
いいねボタンはcreateアクション内で新たにデータを作成後、投稿詳細ページへとリダイレクトされる。いいね取り消しボタンはlikesコントローラにdestroyアクションを作成する。
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
post "likes/:post_id/create" => "likes#create"
post "likes/:post_id/destroy" => "likes#destroy"
<% 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要素を書くことでその部分をリンクにできる。
<%= 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
def show
@like_count=Like.where(post_id: @post.id.count
end
#いいねした投稿の表示
あるユーザがいいねした投稿を一覧で表示する。(ユーザに関わるページなので、usersコントローラの中をいじる)いいねした投稿を一覧で表示するためにlikesアクションをusersコントローラ内に作成。
get "users/:id/likes" => "users#likes"
def likes
@user=User.find_by(id: params[:id])
@likes=Like.where(user_id: @user.id)
end
<% @likes.each do |like| %>
<% post=Post.find_by(id: like.post_id) %>
<% end %>