🦥

コメント一覧表示(コメントした投稿確認できる)

2024/07/13に公開

https://zenn.dev/sudoukky/articles/c112704b901fc6
参考にさせていただきました。

ポートフォリオ(SNS)を作成中です。
コメントの管理をできるように、管理者側にコメント一覧を表示させたいのと、
どんな投稿に対してコメントされたのか、リンクで投稿詳細画面に遷移できるようにしました。まとめです。

  • ルーティング記述

    :
    resources :comments, only: [:index, :destroy]
    :
    
  • コントローラー

    admin/comments_controller
    def index
      @comments = Comment.includes(:post, :user).all
    end
    
    def destroy
      @comment = Comment.find(params[:id])
      @comment.destroy
      redirect_to admin_comments_path
    end
    
    @comments = Comment.includes(:post, :user).all
    

    Comment.allではない理由は、コメントがされている投稿をリンクで飛べるようにしたいから。
    "includes"は、配列内にある特定の要素が存在するのかチェックするのに使う。

  • ビュー

admin/comment/index.html.erb
  
  <div class="container mt-5">
  <div class="row">
    <div class="mx-auto offset-lg-2">
      <div class="text-center">
        <h3>* コメント一覧 *</h3>
      </div>


      <table class="table mt-5">
        <thead>
          <tr>
            <th>ユーザー名</th>
            <th>コメント</th>
            <th>コメント日時</th>
            <th></th>
            <th></th>
          </tr>
        </thead>


        <tbody>
          <% @comments.each do |comment| %>
            <tr>
              <td><%= @users.find(comment.user_id).name %></td>
              <td><%= comment.comment %></td>
              <td><%= comment.created_at.strftime('%Y/%m/%d') %></td>
              <td><%= link_to "投稿を見る", post_path(comment.post), class:"btn btn-sm btn-dark" %></td>
              <td><%= link_to "削除", admin_comment_path(comment), method: :delete, data: { confirm: '本当に削除しますか?' }, class:"btn btn-sm btn-danger" %></td>
            </tr>
          <% end %>
        </tbody>
      </table>
    </div>
  </div>
  • 上記をしたことにより、投稿の詳細ページに記載がある、ログインしてるユーザーの場合には、投稿の編集ボタンを表示させて、他の人の場合には表示させない条件分岐にエラーが発生してしまう。

※修正前

<% if @post.user_id == current_user.id %>

※修正後

<% if current_user && @post.user_id == current_user.id %>

1.'current_user'が存在すること(ユーザーがログインしていること)
2.'@post.user_id'が'current_user.id'と一致すること

'current_user'がnilでないことを先に確認して、
その後に、'@post.user_id'と'current_user.id'を比較することで、
エラーが回避。

  • 詳しく解説
    *'current_user &&...最初にcurrent_userが存在するかどうか確認する。'&&'演算子は左側の条件が'false'や'nil'の場合は、
    右側の条件を評価しないため、'current_user'が'nil'の場合は、その時点で条件評価が終了し、'nil.id'のようなエラーが発生しなくなる。

    *'@post.user_id == current_user.id'
    'current_user'が存在する場合のみ、この条件が評価される。
    '@post.user_id'が'current_user.id'と一致するか確認する。


  • ユーザーがログインしている(current_userが存在する)場合:
    例えば、current_user.idが1で、@post.user_idも1であれば条件はtrueになり、「編集」リンクが表示されます。
    current_user.idが1で、@post.user_idが2であれば条件はfalseになり、「編集」リンクは表示されません。
    ユーザーがログインしていない(current_userがnil)場合:
    current_userがnilなので、条件全体がfalseとなり、@post.user_id == current_user.idは評価されず、エラーも発生しません。「編集」リンクは表示されません。
    この修正により、ログインしていないユーザーがページを表示した場合でもエラーが発生せず、適切に処理されるようになります。

これは基礎でやってる内容なんだろうけど、理解が乏しすぎて、まとめて見ました。コードを書くってとっても難しい。まだ楽しい感情は生まれないかな...

Discussion