LoginSignup
0
1

More than 3 years have passed since last update.

コメント機能に削除機能を追加したい

Posted at

【概要】

1.結論

2.どのように実装したのか

3.今後していきたいこと

1.結論

❶commentコントローラーのdestroyアクションに、投稿したidを紐づけて削除できるようにする。

❷ネスト化したpathにlink_toで削除ボタン押下できるようにする。


2.どのように実装したのか

<開発環境>
Ruby: 2.6.5
Rails: 6.0.3.3
controllers/comments_controller.rb
  def destroy
    redirect_to root_path unless user_signed_in? || current_user.id == @time.user_id && current_user.id == comment.user_id #---(1)
    @comment = Comment.find(params[:time_id])
    if @comment.destroy  #---(2)
      redirect_to time_path #---(3)
    else
      redirect_to root_path #---(4)
    end
  end

❶commentコントローラーのdestroyアクションに、投稿したidを紐づけて削除できるようにしました。
(1)ではログアウトしてる人や、自分以外の投稿者が自分の投稿のコメントを削除される(直接URLの入力して削除される)のを防ぐためです。
(2)は自分が投稿したコメントの削除を実行します。
(3)は成功すればコメント投稿画面に戻ります。
(4)はコメントの削除に失敗すればトップページに戻ります。

view/time/show.html.erb
      <% if @comments %>#---(1)
        <% @comments.each do |comment| %>#---(2)
          <p>
           <%= comment.user.name %>:#---(3)
            <% if user_signed_in? && current_user.id == @time_report.user_id && current_user.id == comment.user_id %>
              <%= link_to '❌', time_report_comment_path(comment.id), method: :delete %> #---(4)
               <%= comment.content %> #---(5)
            <% end %>
           </p>
        <% end %>
      <% end %>

❷ネスト化したpathにlink_toで削除ボタン押下できるようにしました。
(1)は"もしコメントがあれば"ということで、インスタンス変数でtimeコントローラーから持ってきています。
(2)User➡︎commentsはhas_manyなのでたくさんあるコメントを持ってきています。
(3)その中でも紐づけられたコメントしたユーザー名だけ表示しています。
(4)ルーティングでコメントをネスト化しているので自分で投稿した自分のコメントを自分で削除できるようにしています。
(5)コメントの内容を表示しています。


3.今後していきたいこと

SPAを実装したいです。吹き出しマークをクリックしたら、非同期的(ページ遷移がなく)にコメントが表示され、そこで編集や削除ができるようなアプリケーションにしたいです。そのためにはNuxt.js/Vue.jsの知識が必要になってくるのでコツコツ勉強していきます。

0
1
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
1