😎

いいね一覧表示

2023/08/29に公開

はじめに

今日もチームメンバーの機能実装を手伝ったのでその内容をまとめました。
いいね機能は実装している前提です。

ルーティング作成

ユーザーのマイページから、そのユーザーのお気に入りしてる記事に飛びたいので、
users/1/favorites というルーティングにしたかったのでmember doを使用します。

routes.rb
resources :users, only: [:show,:index,:edit,:update] do
    member do
      get :favorites
    end
 end
member do / collection doについて

簡単に説明するとmember doはidがついてcollection doはidがつかない特徴があります。
詳しく書くと以下のようになるマス。

member doとは

member doを使うと、ユーザーidが含まれてるurlを使えるようになります。
member は特定のデータに対するアクションに利用するそうです。
ルーティングはこうなります。
users/:id/favorites

collection doとは

member doとは違いidがつかなくなります。
ルーティングはusers/favoritesになります。

コントローラー

ユーザーがいいねした投稿を取得するための記述をします。

users_controller.rb
def favorites
    @user = User.find(params[:id])
    favorites= Favorite.where(user_id: @user.id).pluck(:post_id)
    @favorite_posts = Post.find(favorites)
  end

重要なのがこの一文です。favorites= Favorite.where(user_id: @user.id).pluck(:post_id)
favoritesに@userがいいねしたpost_idがすべて取得されます。
それを@favorite_postsに代入されるようにします。

plunkとは

pluckメソッドは、全てのデータではなく特定のカラムの値だけ取得したい場合に使うと便利です。
Product.pluck(:name)という記述があった場合、
productモデルのnameカラムの一覧を持ってこれます。
またpluckメソッドは、条件を抽出してくれるwhereメソッドと併用する事が出来ます。
今回の場合だと

favorites= Favorite.where(user_id: @user.id).pluck(:post_id)
favoriteモデルに保存されているuser_idのpost_idを取得するということになる。

似たようなメソッドでmapメソッドという物があったので解説入れておきます。

mapメソッドとは

mapメソッドは、配列の要素の数だけブロック内で処理を繰り返して、新しい配列を返します。
条件を指定して一覧表示ができるイメージのようです。

配列.map { |変数| 実行する処理 }

# 実行する処理が複数行に渡る場合
配列.map do |変数|
  実行する処理
end

以下の例ではnumbersを2倍にして一覧表示がされます。

例)
irb(main):001:0> numbers = [10, 20, 30, 40]
=> [10, 20, 30, 40]
irb(main):002:0> new_numbers= numbers.map { |n| n * 2 }
=> [20, 40, 60, 80]
irb(main):003:0> new_numbers
=> [20, 40, 60, 80]

View

users/show.html.erb
<p><%=link_to"お気に入り記事",favorites_user_path(@user) %></p>
favorites.html.erb
いいね一覧
<% @favorite_posts.each do |post|%>
<%=post.title %>
<% end %>

これでいいね一覧が実装できると思います。

参考にさせていただいた記事

https://pikawaka.com/rails/pluck
https://pikawaka.com/ruby/map

まとめ

いいね一覧は一度自分のPFに実装したので手順はわかっていたのですが、なんとなくで使っていたpluckmapメソッドについての理解を深めることができました!!
PF提出が今日までなので再度デプロイに問題がないか確認してから今日の学習は終了したいと思います。

Discussion