コメント一覧表示(コメントした投稿確認できる)
参考にさせていただきました。
ポートフォリオ(SNS)を作成中です。
コメントの管理をできるように、管理者側にコメント一覧を表示させたいのと、
どんな投稿に対してコメントされたのか、リンクで投稿詳細画面に遷移できるようにしました。まとめです。
-
ルーティング記述
: resources :comments, only: [:index, :destroy] :
-
コントローラー
admin/comments_controllerdef 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"は、配列内にある特定の要素が存在するのかチェックするのに使う。 -
ビュー
<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