【Favorite】Rails 좋네요 기능 구현



【골】



사용자에게 게시물에 대해 좋아하는 기능 구현
좋아요를 누르면 하트가 붉어집니다.

참고 : htps : // 코 m / 삼각형 / ms / 2c66499848d882c31

【메리트】



UI, UX 향상
어소시에이션의 이해도 향상

【개발 환경】



■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

【실장】 "user" "post"기능 구현은 할애


  • favorite model 작성

  • mac.terminal
    $ rails g model Favorite
    
  • 어소시에이션 추기

  • ※ user : favorite = 1 : 다
    ※ post : favorite = 1 : 다

    models/post.rb
    has_many :favorites
    def favorited_by?(user)
        favorites.where(user_id: user.id).exists?
    end
    

    models/user.rb
    has_many :favorites
    

    models/favorite.rb
    belongs_to :user
    belongs_to :post
    

    route 추가
    ※ "favorite"는 "post"에 관련되어 있으므로 루트를 중첩 (부모와 자식)

    config/routes.rb
    resources :posts do
        resources :favorites , only: [:create , :destroy]
    end
    

    favorite controller 작성
    ※ "create", "destroy"도 함께 작성

    mac.terminal
    $ rails g controller Favorites create destroy
    

    favorite controller 설명
    ①, ②에서 user_id post_id를 parameter에 전달

    favorites_controller.rb
    class FavoritesController < ApplicationController
      def create
        @post = Post.find(params[:post_id]) ①
        favorite = @post.favorites.new(user_id: current_user.id) ②
        favorite.save
        flash[:success] = "Liked post"
        redirect_to request.referer
      end
    
      def destroy
        @post = Post.find(params[:post_id]) ①
        favorite = current_user.favorites.find_by(post_id: @post.id) ②
        favorite.destroy
        redirect_to request.referer
      end
    end
    
    

    view 설명
    ※ model으로 기술 “@post.favorited_by?”를 사용

    post/show.html/erb
    <% if @post.favorited_by?(current_user) %>
       <%= link_to post_favorite_path(@post), method: :DELETE do %>
       <i class="fa fa-heart" aria-hidden="true" style="color: red;"></i>
       <%= @post.favorites.count %>like
       <% end %>
    <% else %>
      <%= link_to post_favorites_path(@post) , method: :POST do %>
      <i class="fa fa-heart-o" aria-hidden="true"></i>
      <%= @post.favorites.count %>like
      <% end %>
    <% end %>
    

    이상

    좋은 웹페이지 즐겨찾기