GeekSalon名古屋メンターの吉田です!
オリジナル開発でマイページにいいね欄(いいねした投稿をマイページに表示)をつけたいという受講生が何人かいたので記事にしました!
良ければ参考にして下さい。
(カラム名などはGeektwitterのものをそのまま使っています)
##過去の投稿欄の作成
いいね欄の前にこの機能をつけた方が多いと思うので、こちらのコードを紹介して**「いいね欄はその応用で作れる!」**ということを理解してもらおうと思います。
この機能は必要ないという方は飛ばしてもらって構いませんが、参考までに一読しておいて下さい。
まずは以下のコードをusers_controller.rb
に追加しましょう
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
<!--ここから-->
@tweets = @user.tweets
<!--ここまで-->
end
end
これにより@tweetsというインスタンス変数にユーザーモデル(@user)がもつその人の投稿(tweets)が代入されました。これをviewsで使いましょう
以下のコードをusers>show.html.erb
の下の方に挿入して下さい
<h2>過去の投稿</h2>
<% @tweets.each do |tweet| %>
<div class="user-tweet">
<hr>
<p style="word-break: break-all;"><span>投稿本文: </span>
<%=link_to tweet
.body, tweet_path(tweet.id) %></p>
</div>
<% end %>
これで過去の投稿本文が表示されるようになりました。本文ではなくタイトルが良いという方は、bodyの部分をtitleなどに変更して下さい。
##いいね欄の実装
いよいよいいね欄の実装ですが、やることは先の機能とあまり変わりません。
まずは「いいねした投稿」がどのようにuserモデルと結びついているか確認しましょう。
class User < ApplicationRecord
has_many :tweets, dependent: :destroy
has_many :likes, dependent: :destroy
has_many :liked_tweets, through: :likes, source: :tweet
has_many :comments, dependent: :destroy
def already_liked?(tweet)
self.likes.exists?(tweet_id: tweet.id)
end
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :name, presence: true #追記
validates :profile, length: { maximum: 200 } #追記
end
has_many:tweets
が先ほど使った「自分の投稿」ですね。そして
「いいねした投稿」はhas_many :liked_tweets
です。これを使いましょう。
以下のように記述して下さい。
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@tweets = @user.tweets
<!--ここから-->
@likes = @user.liked_tweets
<!--ここまで-->
end
end
そしてviewsの方は
<h2>いいね欄</h2>
<% @likes.each do |like| %>
<div class="like-tweet">
<hr>
<p style="word-break: break-all;"><span>投稿タグ: </span>
<%=link_to like.body, tweet_path(like.id) %></p>
</div>
<% end %>
となります。
こちらも本文ではなくタイトルにしたい場合bodyをtitleなどに変更してください。
####以上です。お疲れ様でした!