🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1647閲覧

Ajaxを用いた非同期コメント機能

shawn_709

総合スコア13

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/02/27 03:32

編集2021/02/27 03:36

ご回答いただけるとありがたいです。よろしくお願いします!

実現したいこと

非同期でのコメント機能を実装したいです。

現状

以下を参考に非同期でコメント機能を実装することができました。
[Rails]Ajaxを用いて非同期でコメント機能の実装

しかし現状以下のようになっています。
(コンテンツ詳細ページにコメント投稿フォームを設置)
コンテンツ詳細ページに遷移→「コメント1」と入力し送信→非同期で表示される→「コメント2」と入力し送信→非同期で表示される

ここまでは良いのですが、一度トップページに戻り、同じコンテンツ詳細ページに遷移し、「コメント3」と入力し送信すると、
コメント1
コメント2
コメント3
コメント1__(←重複)__
コメント2__(←重複)__
と表示されます。なぜか、元々あったコメントが重複して下に表示されてしまいます。リロードするか、ページを離れもう一度コンテンツ詳細ページに遷移すれば、重複表示は無くなっています。

また、
コメント1
コメント2
コメント3
の状態で、コメント1を削除すると、
コメント2
コメント3
コメント1__(←重複)__
コメント2__(←重複)__
コメント3__(←重複)__
と表示されます。
これらを解決したいです。

該当のソースコード

migration

1class CreateComments < ActiveRecord::Migration[6.0] 2 def change 3 create_table :comments do |t| 4 t.text :comment_content, null: false 5 t.references :user, null: false, foreign_key: true 6 t.references :content, null: false, foreign_key: true 7 t.timestamps 8 end 9 end 10end

models

1#user 2has_many :contents 3has_many :comments, dependent: :destroy 4 5#content 6belongs_to :user 7has_many :comments, dependent: :destroy 8 9#comment 10belongs_to :user 11belongs_to :content 12 13validates :comment_content, presence: true

routes

1resources :contents do 2 resources :comments, only: [:create, :destroy] 3end

controller

1#contents 2def show 3 @content = Content.find(params[:id]) 4 @comment = Comment.new 5 @comments = @content.comments.includes(:user) 6end 7 8#comments 9class CommentsController < ApplicationController 10 11 def create 12 @content = Content.find(params[:content_id]) 13 @comment = @content.comments.build(comment_params) 14 @comment.user_id = current_user.id 15 @comment.save 16 render :index 17 end 18 19 def destroy 20 @comment = Comment.find(params[:id]) 21 @comment.destroy 22 render :index 23 end 24 25 private 26 27 def comment_params 28 params.require(:comment).permit(:comment_content, :user_id, :content_id) 29 end 30 31end

views

1#contents/show 2<div class="row"> 3 <ul> 4 <li class="comment-create"> 5 <h3 class="text-left title">コメント</h3> 6 </li> 7 <li id="comments_area"> 8 <%= render partial: "comments/index", locals: { comments: @comments } %> 9 </li> 10 </ul> 11 <hr> 12 <div class="comment-create"> 13 <h3 class="text-left">コメントを投稿する</h3> 14 <%= render partial: "comments/form", locals: { comment: @comment, content: @content } %> 15 </div> 16</div> 17 18#comments/_index 19<%= comments.count %>件コメント 20<% comments.each do |comment| %> 21 <% unless comment.id.nil? %> 22 <li class="comment-container"> 23 <div class="comment-box"> 24 <div class="comment-text"> 25 <p><%= comment.user.nickname %></p> 26 <div class="comment-entry"> 27 <%= comment.comment_content %> 28 <% if comment.user == current_user %> 29 <%= link_to content_comment_path(comment.content_id, comment.id), method: :delete, remote: true, class: "comment_destroy" do %> 30 <i class="fas fa-trash fa-fw"></i> 31 <% end %> 32 <% end %> 33 </div> 34 </div> 35 </div> 36 </li> 37 <% end %> 38<% end %> 39 40#comments/_form 41<%= form_with(model: [content, comment], url: content_comments_path(@content)) do |f| %> 42 <%= f.text_area :comment_content %> 43 <%= f.submit "送信" %> 44<% end %> 45 46#comments/_index.js.erb 47$("#comments_area").html("<%= j(render 'index', { comments: @comment.content.comments }) %>") 48$("textarea").val('')

###試したこと
以下を参考にしました。
Ajaxを用いた動的なコメント投稿・削除機能の実装で学ぶRuby on Rails

controller

1class CommentsController < ApplicationController 2 3 def create 4 @content = Content.find(params[:content_id]) 5 @comment = @content.comments.build(comment_params) 6 @comment.user_id = current_user.id 7 if @comment.save //ifで条件分岐 8 render :index 9 end 10 end 11 12 def destroy 13 @comment = Comment.find(params[:id]) 14 if @comment.destroy //ifで条件分岐 15 render :index 16 end 17 end 18 19 private 20 21 def comment_params 22 params.require(:comment).permit(:comment_content).merge(user_id: current_user.id, content_id: params[:content_id]) 23 //mergeで外部キーを取得 24 end 25 26end

migration

1class CreateComments < ActiveRecord::Migration[6.0] 2 def change 3 create_table :comments do |t| 4 t.text :comment_content, null: false 5 t.integer :user_id, null: false 6 t.integer :content_id, null: false 7 t.timestamps 8 end 9 end 10end

エラーにはなりませんでしたが、現状は変わりませんでした。
以上になります。ご助言いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

views/comments/_index.html.erbファイルを全て書き直したら、なぜか解決しました。
書き直した理由はtabキーをクリックしたら、スペースが4つ開くことに違和感を感じたからです。(普段はスペース2つ)
ファイル自体がおかしいのかな?と思い書き直したら解決しました。

投稿2021/02/27 03:51

shawn_709

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問