いいね一覧表示
はじめに
今日もチームメンバーの機能実装を手伝ったのでその内容をまとめました。
いいね機能は実装している前提です。
ルーティング作成
ユーザーのマイページから、そのユーザーのお気に入りしてる記事に飛びたいので、
users/1/favorites というルーティングにしたかったのでmember do
を使用します。
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
になります。
コントローラー
ユーザーがいいねした投稿を取得するための記述をします。
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
<p><%=link_to"お気に入り記事",favorites_user_path(@user) %></p>
いいね一覧
<% @favorite_posts.each do |post|%>
<%=post.title %>
<% end %>
これでいいね一覧が実装できると思います。
参考にさせていただいた記事
まとめ
いいね一覧は一度自分のPFに実装したので手順はわかっていたのですが、なんとなくで使っていたpluck
やmap
メソッドについての理解を深めることができました!!
PF提出が今日までなので再度デプロイに問題がないか確認してから今日の学習は終了したいと思います。
Discussion