💻
いいね機能まとめ
モデル
投稿モデルの記述を確認します。
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