0
0

過去の投稿欄、いいね欄の追加

Last updated at Posted at 2023-11-05

GeekSalon名古屋メンターの吉田です!

オリジナル開発でマイページにいいね欄(いいねした投稿をマイページに表示)をつけたいという受講生が何人かいたので記事にしました!
良ければ参考にして下さい。
(カラム名などはGeektwitterのものをそのまま使っています)

##過去の投稿欄の作成
いいね欄の前にこの機能をつけた方が多いと思うので、こちらのコードを紹介して**「いいね欄はその応用で作れる!」**ということを理解してもらおうと思います。
この機能は必要ないという方は飛ばしてもらって構いませんが、参考までに一読しておいて下さい。

まずは以下のコードをusers_controller.rb に追加しましょう

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の下の方に挿入して下さい

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モデルと結びついているか確認しましょう。

models>user.rb
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です。これを使いましょう。
以下のように記述して下さい。

users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @tweets = @user.tweets
    <!--ここから-->
    @likes = @user.liked_tweets
    <!--ここまで-->
  end
end

そしてviewsの方は

users>show.html.erb
<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などに変更してください。

####以上です。お疲れ様でした!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0