前提・実現したいこと
グループチャットの投稿機能を非同期通信化しているのですが、Postが2回実行され、データベースに同じレコードが2つ保存されてしまいます。
そのため、投稿直後はjbuilderで返ってきたデータが1つだけ表示されるのですが、リロードすると2つ表示されます。
post.js全てをコメントアウトすると、保存されるレコードは1つになるので、ajaxの記述に問題があると思うのですが、解決できていません。
お分かりになる方、ご教示いただけないでしょうか。
(画像複数投稿を実装中のため、コントローラーが見辛くて申し訳ございません。)
発生している問題
当然ながらCOMMITも2回実行されています。
#terminalログ Started POST "/groups/1/posts" for ::1 at 2020-05-15 14:56:16 +0900 Processing by PostsController#create as JSON Parameters: {"utf8"=>"✓", "authenticity_token"=>"aDzWViLa+JFs9B/VOPE05S8GFVukjGXVaMHKQwsDJr4CX+OX2Ce7j4sPhHLcxNe6SF9K9OdCF4Z76gW7uB+HPQ==", "post"=>{"content"=>"fけおうぃあ"}, "group_id"=>"1"} ###2つめのStarted Post!! Started POST "/groups/1/posts" for ::1 at 2020-05-15 14:56:16 +0900 User Load (1.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 ↳ /Users/miyu/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98 Group Load (0.3ms) SELECT `groups`.* FROM `groups` WHERE `groups`.`id` = 1 LIMIT 1 ↳ app/controllers/posts_controller.rb:42 (1.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 (0.2ms) BEGIN ↳ /Users/miyu/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98 ↳ app/controllers/posts_controller.rb:21 Processing by PostsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token" ・・・・・・・・・・以下略
該当のソースコード
javascript
1#post.js 2$(function () { 3 function buildHTML(post) { 4 if (post.post_files) { 5 var html = 6 省略 7 } else { 8 var html = 9 省略 10 } 11 return html; 12 } 13 14 $('#new_post').on('submit', function (e) { 15 e.preventDefault() 16 var formData = new FormData(this); 17 var url = $(this).attr('action'); 18 $.ajax({ 19 url: url, 20 type: "POST", 21 data: formData, 22 dataType: 'json', 23 processData: false, 24 contentType: false 25 }) 26 .done(function (data) { 27 var html = buildHTML(data); 28 $('.posts').prepend(html); 29 $('form')[0].reset(); 30 $('.submit-btn').prop('disabled', false); 31 }) 32 .fail(function () { 33 alert("投稿に失敗しました"); 34 }) 35 }); 36});
ruby
1#posts_controller.rb 2class PostsController < ApplicationController 3 before_action :set_group 4 5 def index 6 @post = Post.new 7 @post_file = @post.post_files.build 8 @posts = @group.posts.includes(:user).order("created_at DESC") 9 @post_files = @post.post_files.all 10 @looks = Look.new 11 end 12 13 def create 14 @post = @group.posts.new(post_params) 15 if @post.save 16 if params[:post_files].present? 17 params[:post_files]['file'].each do |a| 18 @post_file = @post.post_files.create!(file: a, post_id: @post.id) 19 end 20 end 21 respond_to do |format| 22 format.json 23 end 24 else 25 @posts = @group.posts.includes(:user).order("created_at DESC") 26 render :index 27 end 28 end 29 30 private 31 def post_params 32 params.require(:post).permit(:content, post_files_attributes: [:file]).merge(user_id: current_user.id) 33 end 34 35 def set_group 36 @group = Group.find(params[:group_id]) 37 end 38end 39
試したこと
恥ずかしながら、いろいろなワードで検索しましたが、同様のケースを見つけることができず、解決の糸口が掴めておりません。
補足情報(FW/ツールのバージョンなど)
Ruby on Rails 5.2.3
JavaScript
jquery
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。