質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

1113閲覧

投稿機能にajaxを導入した途端、データが2つ保存されてしまう

tiki

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/05/15 06:41

前提・実現したいこと

グループチャットの投稿機能を非同期通信化しているのですが、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

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

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

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

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

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

guest

回答2

0

自己解決

post#createではjsでリクエストされ、jsonにしてもjsのリクエストが消えていないことが原因?

user#createでデータを送信してみた。→html形式でリクエストされていた!

postではform_withを使用、userではform_for使用しているという違いがあったので、postもform_forにしてみた。

post#createのリクエストがhtml形式に変わり、ajaxを足したら、json形式のみになった。

一旦解決はしましたが、なぜform_withではいけなかったのかよくわかりません。
ajaxの記述との相性なのでしょうか・・・
お分かりになる方いらっしゃれば、ご教示いただけますと幸いです。

投稿2020/05/16 02:22

tiki

総合スコア0

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

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

0

jQueryだけ見るとajaxは1度しか発行していないようにみえます
submitは殺しているので2度送ることはないでしょう。
あとはrubyを一旦排除してスタティックなhtml+jsで追いかけることです

投稿2020/05/15 08:49

yambejp

総合スコア116732

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

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

tiki

2020/05/15 09:30

回答ありがとうございます。 初学者のため的外れな質問でしたらご容赦ください。 rubyを一旦排除するとは、createメソッドを排除してみるということでしょうか。 createメソッドをコメントアウトしてみたところ、下記のようなterminalログとなりました。 ``` Started POST "/groups/1/posts" for ::1 at 2020-05-15 18:22:31 +0900 Started POST "/groups/1/posts" for ::1 at 2020-05-15 18:22:31 +0900 Processing by PostsController#create as JSON Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZH6LzwKfPiyP1dzPUfidxxU9V6UX+xpr/Q2zxNIMmewOHb4O+GJ9MmguR2i1zX6YcmQIClQ1aDjuJnw8YRA4bw==", "post"=>{"content"=>"あいうえお"}, "group_id"=>"1"} User Load (23.2ms) 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 Processing by PostsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZH6LzwKfPiyP1dzPUfidxxU9V6UX+xpr/Q2zxNIMmewOHb4O+GJ9MmguR2i1zX6YcmQIClQ1aDjuJnw8YRA4bw==", "post"=>{"content"=>"あいうえお"}, "commit"=>"投稿", "group_id"=>"1"} Group Load (1.5ms) SELECT `groups`.* FROM `groups` WHERE `groups`.`id` = 1 LIMIT 1 ↳ app/controllers/posts_controller.rb:42 User Load (42.1ms) 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 Rendering posts/create.json.jbuilder Group Load (37.6ms) SELECT `groups`.* FROM `groups` WHERE `groups`.`id` = 1 LIMIT 1 ↳ app/controllers/posts_controller.rb:42 Rendering posts/create.json.jbuilder Rendered posts/create.json.jbuilder (105.2ms) Completed 500 Internal Server Error in 186ms (ActiveRecord: 24.7ms) #エラー内容が続く ``` Started Postが2回ということは変わらず、jsonとjsで1回ずつデータを送っているようです。 この場合、htmlとjsに問題があるということでしょうか。 恐れ入りますが、よろしくお願いいたします。
yambejp

2020/05/15 09:48 編集

えーと、rubyでhtmlを作成しているなら、作成後のhtmlを利用して 検証してくださいということです。 ブラウザでソースを表示してコピペしてhtmlとして保存すればよいでしょう。 jsが2度送る仕組みになっているかどうかを検証できます。
tiki

2020/05/15 12:48

ご教示いただきありがとうございます。 検証からコピペして新たにpost.htmlを作成しました。 createでbinding.pryもしてみましたが、やはり、データ形式がjsonとjsで2回送られてしまいます。 意図としては、jsで送られないようにしたいのですが、posts.jsとform以外に確認すべきファイルはありますでしょうか。 度々申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問