💻

いいね機能まとめ

2023/10/01に公開

モデル

投稿モデルの記述を確認します。

post_image.rb
  def favorited_by?(user) 
    favorites.exists?(user_id: user.id) 
  end

1.favorited_by?メソッドを作成します。引数はuserとします。
2. post_imageモデルのhas_manyで定義されたfavoritesに対してexists?メソッドを使います。user.idは1.の引数のuserと対応しています。

このメソッドによって「引数のユーザーがこの投稿にいいねをしているか?」の確認を行います。

コントローラー

favoriteコントローラーを確認します。

favorite.controller.rb
 def create
    post_image = PostImage.find(params[:post_image_id])  
    favorite = current_user.favorites.new(post_image_id: post_image.id) 
    favorite.save
    redirect_to post_image_path(post_image)
  end

1.(params[:post_image_id]) としてるのは、(params[:id]) と記述した場合にfavorite.idを取得してしまうためです。
2. current_user.favorites.newの引数として(post_image_id: post_image.id) を指定します。ここまでの記述で、favoriteにはuser_id=current_user、post_image_id=post_image.idが指定されています。

favorite.controller.rb
def destroy
    post_image = PostImage.find(params[:post_image_id])
    favorite = current_user.favorites.find_by(post_image_id: post_image.id) 
    favorite.destroy
    redirect_to post_image_path(post_image)
  end

1.find_byメソッドで条件と一致した最初の投稿を探します。

View

post_images/show.html.erb
<% if @post_image.favorited_by?(current_user) %> 
    <p>
      <%= link_to post_image_favorites_path(@post_image), method: :delete do %>
        ♥<%= @post_image.favorites.count %>いいね
      <% end %>
    </p>
 <% else %>
    <p>
      <%= link_to post_image_favorites_path(@post_image), method: :post do %>
        ♡<%= @post_image.favorites.count %>いいね
      <% end %>
    </p>
 <% end %>

1.if文の中の@post_imageは投稿コントローラーで定義したものです。
作成したfavorite_byメソッドを使用するにあたり、メソッドを記述したモデルの指定が必要なため記述しています。
2.前述した「引数のユーザーがこの投稿にいいねをしているか?」の真偽をif文をつかっておこないます。真の場合はいいねを消す。偽(else)の場合はいいねをつけるという仕様になっています。

Discussion