좋아하는 기능 만들기 (Ruby on Rails)

프로그래밍 공부 일기



2020년 7월 24일 Progate Lv.221
Ruby on RailsX

Like 모델 준비



「어떤 유저」가 「어느 투고」를 좋아하는지 기록하기 위해서 데이터베이스에 user_idpost_id 의 2 개의 컬럼을 가지는 liques 테이블을 준비한다. 명령을 실행하여 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 액션 내에서 새롭게 데이터를 작성 후, 투고 상세 페이지로 리디렉션된다. 좋아 취소 버튼은 liques 관제사에 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



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

좋아하는 소식 보기



특정 사용자가 좋아하는 게시물을 목록으로 표시합니다. (사용자와 관련된 페이지이므로, users 컨트롤러 안을 만지다) 좋아하는 투고를 일람으로 표시하기 위해 like 액션을 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 %>

좋은 웹페이지 즐겨찾기