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

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

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

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

Ruby on Rails

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

Ajax

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

Q&A

解決済

2回答

3675閲覧

Rails Update アクションが複数回呼ばれる

Takuyamatsumot6

総合スコア19

Ruby

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

Ruby on Rails

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

Ajax

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

0グッド

1クリップ

投稿2014/12/24 15:16

こんばんは。Rails Updateについて質問があります。
現在練習で小さなサイトを作っているのですが、Ajaxを用いて呼んでいるUpdateアクションが複数回呼ばれてしまい困っています。ページ遷移後一度目は問題なく一度のみ呼ばれるのですが、以降、Updateでユーザー情報を更新する度に一回ずつUpdateが呼ばれる回数が増えていきます。

以下UpdateのコードとAjaxのコードになります。

lang

1def update 2 # short_bio = update したい情報 3 short_bio = params["short_bio"] 4 id = params.require(:id) 5 if short_bio.blank? 6 rtn_text = 'Default Text' 7 else 8 User.find_by(id: id).update(bio: short_bio) 9 rtn_text = User.find(id).bio 10 end 11 render text: rtn_text 12end

lang

1$(document).on('dblclick', '#add-bio', function(e){ 2 $(this).html("<input id ='update-bio' type='text'>"); 3 $('#add-bio').keypress(function(e){ 4 if (e.which == 13) { 5 var short_bio = ($('#update-bio').val()).trim(); 6 var update_user_id = currentpage_userid(); 7 8 $.ajax({ 9 url : '/users/' + update_user_id, 10 data : {short_bio: short_bio}, 11 type : 'PATCH', 12 dataType : 'text' 13 }).done(function(data){ 14 $('#add-bio').text(data); 15 }); 16 } 17 } 18});

下記のクエリの呼ばれる回数がどんどん増えていきます。

lang

1Started PATCH "/users/1" for 10.0.2.2 at 2014-12-25 00:04:02 +0900 2Processing by UsersController#update as HTML 3 Parameters: {"short_bio"=>"bio", "id"=>"1"} 4 User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 5 User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 6 (0.3ms) begin transaction 7 (0.4ms) commit transaction 8 User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 9 Rendered text template (0.1ms) 10Completed 200 OK in 35ms (Views: 1.9ms | ActiveRecord: 1.6ms)

これは正しい挙動なのでしょうか?
サンタさん、いましたら助けて頂けると嬉しいです。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

lang

1$(document).on('dblclick', '#add-bio', function(e){ });

このdblclickイベントの「登録」が何回も実行されているということはありませんか?


追記:
解決したようで何よりです。
個人的にはこんな感じがいいです。(Ajaxの代わりにconsole.logしてますが)

lang

1$(document).on('dblclick', '#add-bio', function(e){ 2 var jInput = $("<input id ='update-bio' type='text'>") 3 jInput.val($(this).text()); 4 jInput.keypress(function(e){ 5 if (e.which == 13) { 6 var data = $('#update-bio').val(); 7 console.log("Enter"); 8 $('#add-bio').text(data); 9 } 10 }); 11 $(this).html(jInput); 12 jInput.focus(); 13});

投稿2014/12/25 02:27

hello-world

総合スコア1342

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

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

Takuyamatsumot6

2014/12/25 02:34

回答ありがとうございます。確認してみます!
Takuyamatsumot6

2014/12/25 11:52

確認したところ、keypressとEnterが勝手に何回も押されていました。解決策として $('#add-bio').unbind().bind().keypress(function(e){}); このようにしたところ一度のみ呼ばれるようになりました! なぜ何回も呼ばれてしまったのか理由が分からずもやもやしたままです。 もし分かりましたら教えて頂けると幸いです。 サンタさん、ありがとうございました!
hello-world

2014/12/25 13:00

$('#add-bio').keypress ではなくて $('#update-bio').keypress ですね。 add-bio 要素はHTML上にずっと残り続けるので、ダブルクリックするたびにイベントが登録されてしまいます。
Takuyamatsumot6

2014/12/25 13:11

出来ました!ありがとうございます。
guest

0

投稿2014/12/24 16:21

smith

総合スコア73

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

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

Takuyamatsumot6

2014/12/25 02:33

回答ありがとうございます。クエリという書き方に少し誤解があったかもしれません。 Started Patch から Complete 200 Ok までの一式が2回3回と、どんどん増えていく感じです。これもN+1問題なのでしょうか?GemでBulletを入れているのですがN+1のエラーは出ていません。
Takuyamatsumot6

2014/12/25 11:52

解決しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問