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

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

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

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

Ruby on Rails

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

JavaScript

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

Q&A

解決済

2回答

3156閲覧

二度データが保存される rails & ajax

shuhei_div

総合スコア7

Ruby

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

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2016/10/28 07:45

編集2016/10/28 08:33

###前提・実現したいこと

ruby on railsでメッセージをAPIとajax使用して作っています。
メッセージをほ保存する機能を実装中に以下の2回保存されてしまうエラーが発生しました。

###該当のソースコード

ruby

1 def create 2 @message = @chat_group.messages.new(message_params) 3 respond_to do |format| 4 if @message.save 5 format.json { render json: 6 { 7 name: @message.user.name, 8 date: @message.created_at.strftime('%Y/%m/%d %H:%M:%S'), 9 body: @message.body, 10 id: @message.chat_group.id, 11 } 12 } 13 format.html { redirect_to chat_group_messages_path(@chat_group) } 14 else 15 redirect_to chat_group_messages_path(@chat_group) 16 flash[:alert] = 'fail in post message' 17 end 18 end 19 end

javascript

1 $(function () { 2 $('#new_message').on('submit', function (e) { 3 e.preventDefault(); 4 $.ajax({ 5 url: "./messages.json", 6 type: 'POST', 7 datatype: 'json', 8 data: { 9 message: { 10 body: $(this).find('#message_body').prop('value'), 11 } 12 } 13 }) 14 .done(function (data) { 15 insert(data); 16 alert( "Data Saved: "); 17 }) 18 .fail(function () { 19 console.log("fail"); 20 }); 21 }); 22 }); 23});

###試したこと

saveとpostが行われていることによって2回保存されることまで把握したが、ajaxで行いためpostを外すことができません。またsaveを使用しなければ、created_atやupdated_atが入力されないため、うまくいきません。

このようにajaxを使用したい場合はどのように行うと1回のみの保存でうまくいくでしょうか。

db/migrate にtimestamp null: falseなど記入してもうまくいきませんでした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

saveとpostが行われていることによって2回保存されることまで把握したが、ajaxで行いためpostを外すことができません。またsaveを使用しなければ、created_atやupdated_atが入力されないため、うまくいきません。

このようにajaxを使用したい場合はどのように行うと1回のみの保存でうまくいくでしょうか。

Ruby on Rails がまったくわかりませんが、一般的には、onsubmit のハンドラの結果が false を返すようにすれば、ブラウザによるフォームの POST を止めることができます。

参考:onsubmitの戻り値をfalseにしてsubmitを実行しない(中断させる)方法

投稿2016/10/28 10:32

mit0223

総合スコア3401

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

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

shuhei_div

2016/10/28 10:50

ブラウザによるformを止めるとうまくいきました。 ありがとうございます。 もう一度熟考します。
guest

0

上がっているコードを見た感じ、1回の保存で終わりそうに見えました。

なのでボタンを2重に押しているか、何かしらの影響でコントローラーのcreateが2回呼ばれているか、createメソッド内で何かレコードに保存するメソッドをsave以外に呼び出しているか、これらの可能性が考えられます。

createメソッド内にbinding.pryを書いてステップ実行しながら、何時2回目の保存が行われているかをみると解決できるかもしれません。

投稿2016/10/28 09:29

kyonsuke19101

総合スコア86

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

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

shuhei_div

2016/10/28 10:20

ありがとうございます!一度行ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問