【rails】「いいね」をdestroyする

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

「いいね」を解除する

前回は記事に「いいね」できるようになった

今回は「いいね」を解除できるようにする

config/routes.rbを開く

    resource :like, only: [:create, :destroy]

destroyアクションを定義する

app/controllers/likes_controller.rbを開く

  def destroy
    article = Article.find(params[:article_id])
    like = article.likes.find_by!(user_id: current_user.id)
    like.destroy!
    redirect_to article_path(article)
  end
  • 該当のarticle_idの記事を探してくる
  • user_idcurrent_user.idの「いいね」を絶対探してくるfind_by!
  • 「いいね」は絶対destroy!する
  • 「いいね」ができたら同じ画面article_pathredirect_toする

「いいね」の有無で画像を切り替える

app/views/articles/show.html.hamlを開く

  - if user_signed_in?
    - if current_user.has_liked?(@article)
      .article_heart
        = link_to article_like_path(@article), data: { method: 'delete' } do
          = image_tag 'heart-active.svg'
    - else
      .article_heart
        = link_to article_like_path(@article), data: { method: 'post' } do
          = image_tag 'heart.svg'
  1. もしログインユーザーが「いいね」していたら?(user_signed_in?
    → ’heart-active.svg’が表示される
  2. 「いいね」していなかったら?(else
    → ’heart.svg’が表示される
  3. /articles/:article_id/like:article_idが含まれている
    → @articlearticle_like_pathに渡す
  4. link_toはデフォルトが「GET」リクエスト
    → それ以外のときはdata: { method: 'delete' }もしくは'post'のように書く

resourceにする理由

削除するときにresourceのほうが都合が良い

resources :likes 複数形にした場合

  • article_idの他に、likeのidも必要になってしまう
  • 1つの記事に同じユーザーが「いいね」できるのは1回なので、likeのidは不要である
  • likeのidを指定して削除できると、違うidも指定して削除できちゃう

likeのidを探して削除する

current_userが「いいね」した中から探して削除する

#DAY25