ご回答いただけるとありがたいです。よろしくお願いします!
実現したいこと
非同期でのコメント機能を実装したいです。
現状
以下を参考に非同期でコメント機能を実装することができました。
[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
エラーにはなりませんでしたが、現状は変わりませんでした。
以上になります。ご助言いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。