• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:RailsのAjax送信されるタイミング)

RailsのAjax送信タイミングについて

このQ&Aのポイント
  • Ruby on Railsで:remote => true設定時のデータ送信タイミングについて困っています。
  • 送信ボタンを押した瞬間に値が送信されず、ボタンを押してから数秒後(長い場合は2〜3秒程度)に値が送信されます。
  • 送信ボタンが押された瞬間に値が送信されるか、ボタン押下後に送信されるまでの間にクリックを無効化することは、Railsで実装可能ですか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#177743
noname#177743
回答No.2

そうですか。となると、普通にフォームを用意して、Ajax送信処理を自分でJavaScriptのスクリプトを書いて自前で用意するのが一番確実のように思えます。jQueryは標準で使えるはずですからそんなに面倒な処理にはならないと思いますし。 ※jQueryでフォームをAjax送信する参考URL http://libro.tuyano.com/index3?id=72001&page=5

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#177743
noname#177743
回答No.1

>しかし、送信ボタンを押した瞬間に値が送信されるのではなく、ボタンを押して少し経ってから(長い時は2~3秒程度?仕様でしょうか)値が送信されます。 これは本当ですか? そうではなくて、押した瞬間に送信はされているけれど、その結果をサーバーから受け取るまで2~3秒かかっている、というだけではありませんか? サーバーにアクセスしその結果を受け取って表示しますから多少のタイムラグはあります。ですからボタンを押して結果が表示されるのに数秒はかかります。 1. 送信ボタンが押された瞬間に値が送信されるようにする 2. ボタン押下後に実際に値が送信されたかどうかを監視し、実際に送信されるまでは2度目以降のクリックを無効にする(ボタンをdisabledにする) 1は、上に述べたように押した瞬間に送信処理そのものは開始されているはずです。で、一般的には2のような実装のほうがよいかと思います。 >これらはrailsで実装可能なのでしょうか。 押した時にどうやってAjax通信を開始しているかわかりませんが、その直前にボタンをディスエーブルにする処理を追加し、受信後の処理にボタンをイネーブルに戻す処理を追加するだけと思いますが……。Ajax通信の処理はどのように実装されているのでしょう。 もしRailsのjQueryコードを生成するメソッドなどを使っているのであれば、それを廃し、JavaScriptでAjax通信する処理をビューテンプレート内に直接用意して呼び出すようにすればよいと思うのですが、それではまずいですか?

perifla
質問者

補足

ボタンを押した瞬間にjQueryの処理自体は呼び出されていますが、form_for内の値の送信自体が遅れて行われます。 これはコンソールを見ていれば明らかです。 送信までの処理に多少時間がかかっているのでしょうが… 環境や処理内容によるとは思いますが、簡単な:remote=>trueを設定したフォームを作成し、コンソールを見ながらボタンを押すと、押下後に値が送信されるまで若干のタイムラグがあり、そのラグの長さが毎回違うことが分かります。 そのラグの長さを固定化できれば、押下後にディレイを設定し、その間はボタンを無効化すれば良いのですが… 処理としては、押したボタンによりあらかじめ用意しておいた、異なるSQLクエリを投げるようにしています。 (コントローラ#updateで Model.saveを行っています) クエリ送信を検知してjQuery等でViewに反映させるには、どうすれば良いのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Rails3でAjaxを使いたい

    どなたが知識をご教授下さい。 Rails3でAjaxのごく普通のハイパーリンクを作成したいのですが、うまくいきません。 /users/index.html.erb <div id="hoge"> <%= link_to "ajax",{:action => 'draw'},:remote => true %> </div> -- /users/_draw.html.erb ~いろいろ内容~ -- /users/draw.js.erb $('#hoge').html("<%= escape_javascript(render :partial => 'draw' )%>"); -- /users_controller.rb def draw ~いろいろ処理~ end -- ルーティング match 'users/draw' => 'users#draw' -- application.html.erb <%= javascript_include_tag :defaults %> -- gemfile gem 'jquery-rails' 以上のように処理するよう様々なサイトや書籍にはありましたが、「Templete Missing」のエラーが出てしまいます。かれこれ5時間以上ハマってまして、、、 どなたか知識をご教授頂けたら幸いです。 *メモ アクションdrawに渡ったときに、 「request.xhr?がfalse」ということは、ajax通信できていないということでしょうか???

    • ベストアンサー
    • Ruby
  • rails3.0 プルダウンの連動について

    ruby on railsにて開発を行っております。 web開発の経験はありますが、 rubyおよびrailsに関しては初心者です。 要件は以下の通りです。 A画面内でrenderにて部分テンプレートの構成となっております。 テンプレート内部にプルダウンを設け、プルダウンの連動により 読み込むテンプレートを切り替えていきたいと考えております。 現在collection_selectを用いてプルダウンを生成し、 onchangeにてremote_functionを呼び出すことで本機能を実装させようと考えておりますが、 テンプレートの切り替えがうまくいきません。 実装方法及び参考となるような情報をご教授いただければと思います。 よろしくお願いします。 環境 rails 3.0.7 ruby 1.9.2

  • Ajax でフォーム内容をサーバに送信

    Ajax でフォーム内容をサーバに送信しようとしています。 テキストであれば、text.valueで値を送信できるのですが、 ラジオボタンの場合、radio.valueやradio.selectedvalueでも どのラジオボタンが選択されているのかが判別できません。 radioのオブジェクトのまま送信したらいいのでしょうか? Ajaxでラジオボタンを判別するにはどのようにしたらいいのでしょうか? よろしくお願いします。

  • ラジオボタンでフォームの送信先を切り替える

    <script type="text/javascript"> <!-- function setDisabledTextbox(F,N1,N2,N3) { if(N1 == "OrderPayment0") { F[N2].disabled = true; F[N3].disabled = false; } else { F[N2].disabled = false; F[N3].disabled = true; } } //--> </script> //フォームの1の記述 <form method="post" action="送信先1"> //ラジオボタン1の記述 <input type="radio" name="payment1" value="値1" onclick="setDisabledTextbox(this.form,this.id,'tbox0','tbox1')" <?php if($payment_name == "値1") echo "checked"; ?> id="OrderPayment0" /> <label for="OrderPayment0">値1</label><br /> //ラジオボタン2の記述 <input type="radio" name="payment2" value="値2" onclick="setDisabledTextbox(this.form,this.id,'tbox0','tbox1')" <?php if($payment_name == "値2") echo "checked"; ?> id="OrderPayment1" /> <label for="OrderPayment1">値2</label><br /> 送信1の入力フォームの記述 <input type="submit" name="tbox0" value="送信1" disabled /> </form> //フォームの2の記述 <form method="post" action="送信先2"> 送信2の入力フォームの記述 <input type="submit" name="tbox1" value="送信2" disabled /> </form> 上記の記述で、最初、送信ボタン1及び送信ボタン2をdisabled状態にしておいて、ラジオボタンの1が押されたら送信ボタンの1を活性化、ラジオボタンの2を押したら送信ボタンの2を活性化するというように切り替えたいのですが、今のところ送信ボタンの1の切り替えはうまくいっているのですが、送信ボタンの2の方がdisabledされたままにまります。フォームの有効範囲の問題かな?と思って、ラジオボタンの2の記述をフォームの2の記述の方に移してみたりしたのですが、結果は同じようです。 両方とも切り替えるようにするには、どのように記述すればよいのでしょうか? 御教示願えればと思います。

  • AJAXとSEO。同期通信とPHP送信の違い

    「AJAX」「SEO」「同期通信」「PHPでPOST送信」について、幾つか分からないことがあるので教えてください ■質問1 ・AJAX通信すると、SEO的に不利なのでしょうか? 例えば、AJAXでCSVファイルを読み込む場合はどうなるでしょうか? もしかして、実装方法による? 下記例で、何か違いはあるでしょうか? ・例1 … 非同期。ページ読込後にCSV読込(そもそもこの実装は可能?) ・例2 … 非同期。ページ読込前にCSV読込 ・例3 … 同期。ページ読込後にCSV読込 ・例4 … 同期。ページ読込前にCSV読込 ■質問2 ・AJAX通信で検索ボタンを押したページ結果は、クローラーされることはあるのでしょうか? サーバからデータを取得しているから反映される? 非同期だったら、反映されない? 同期だったらされる? ■質問3 ・AJAX通信の同期処理の意味が分かりません(jQueryのasyncをfalseなど)。非同期通信がAJAXだと思うのですが、AJAX通信の同期処理というのは、何なのでしょうか? 例えば、「PHPでPOST送信」するのと、原理的には全く同じということになるのでしょうか?(PHPで実装するか、js実装するかの違いだけ?) 最終的に、SEOを重視する場合は(非同期の操作性を捨て)同期処理で実装した方が良い、ということになるのでしょうか?

    • ベストアンサー
    • AJAX
  • Ruby On Rails のインストール

    Ruby On Railsが最近話題になっていて、自分のマシンをインストールしようと思っていますが、バージョンの問題とか、インストールの手順とか、 古い感じで、http://blog.quall.net/opensource/55のサイトを見たら、 RadRailsの最新版が書いてありますが、実際に、違うの手順になっちゃいますが、 経験者に最近の正しい手順を教えていただきたいです。 よろしくお願いします。

  • Rails3でのクリックされたボタンの判定について

    現在Rails3でWEBアプリの開発をしているのですが 実現方法が不明な事が有るので質問させて頂きました。 実行環境は   OS:Windows7   Railsバージョン:3.0.9   APサーバー:WEBrick です。 実現方法が不明なのは、一つのフォームに複数のサブミットボタンを配置し コントローラーでどのボタンが押されたのか判定する方法です。 ビューにおいてフォーム内に  <%= submit_tag 'OK', {:disable_with => "Sending…"} %>  <%= submit_tag 'CANCEL', {:disable_with => "Sending…"} %> と言う様にサブミットボタンを配置し コントローラーでどちらのボタンが押されたのかを判定する方法なのですが 検索して調べてみると  if 'OK' == params[:commit] then   OKボタンが押された際の処理  else   CANCELボタンが押された際の処理  end と言う風に出来ると言う情報を見つけたのですが、実際にやってみると 上記の様な値はparamsから取得出来ないので、正しく動作しません。 paramsで取得した値の中身を見ても、それらしい値も無く 何を判断すればどのボタンが押されたのかを判断出来るのかが判らず 非常に困っております。 サブミットボタンにjavascriptのコードを埋め込み 送信前にHIDDEN項目にクリックされたボタンを表す値を埋め込むと言った方法で 回避する事も可能かとは思いますが、標準的なやり方とも思えず また、良く行われる処理だと思いますので、他に方法が有る様に思えます。 どなたかご存知の方が居れば御回答お願いします。

    • ベストアンサー
    • Ruby
  • ENTERキー押下でフォームを送信したいのに・・・

    PHPとHTMLでフォームをいくつか作り、画像タイプの送信ボタンを押下すると送信されるようにしています。ところが、IEの場合、ENTERキー押下で送信できる(下記のPHPの制御文がtrueになる)ものと、できないものがあります。ボタンをクリックすればいずれも送信できます。また、FirefoxではどのケースでもEnterキー押下で送信できます。送信ボタンはどのフォームでもひとつです。 何がどういう場合に、IEでEnterで送信できないのでしょうか? ○HTML側 <form...> ... <input type="image" name="submit" ...> </form> ○PHP側 if(isset($_POST['submit_x']) { ... }

    • 締切済み
    • PHP
  • テキストボックスを無効にすると値が取得できない

    javascriptでこのようにテキストボックスを無効に してフォームを送信するとphp側でvalueの値が取得できないのですが、入力無効にすると valueは送られないんでしょうか? <form> <input type="text" id="sample" name="sample" value="値" /> </form> スクリプト .document.getElementById('sample').disabled = true; valueにはphpで値をセットし、それをテキストボックスで編集できないようにして 値を飛ばそうとしたのですがテキストボックスのvalueの値が来てないようです。 自分なりに考えたんですが、送信する瞬間だけ(submitボタンが押された時) テキストボックスを有効に戻すようにコードを書いているのですが これ以外で何かありますか? ---このように対処--- <form onsubmit="return disb()"> <input type="text" name="sample" value="値" /> </form> スクリプト document.getElementById('sample').disabled = true; function disb(f){ f.sample.disabled = false; }

  • Ajaxがおかしいんです

    Javascript初級者です。 Ajaxを使ってデータの重複チェックを行おうとしました。 ところがAjaxがヘンな動きをするんです。 以下のコードなんですが、上の登録処理の中で、function doubleCheck を呼んで います。 問題は2つあって、ひとつは実際に重複していてもしていなくても「true」を 返してくることです。 console.log("res=========" + res) には「yes」とか「no」とか重複有り無しで 異なりますが、ちゃんとそれぞれセットするにも関わらず、 if(!doubleCheck() では必ず「false」が戻ってきてしまいます。 もう一つおかしい点は、重複検索(これはPHPでやってます)の最中にもかかわらず、 「true」が返ってきて "重複があったので登録できません。" お、出てしまうことです。 それで調査するために console.logその2を入れてみました(※※※のところ)。 ところがこの console 何も吐き出しません。 ということは doubleCheck() の最後の if文にたどり着いていない、または 途中でエラーになっているのかもしれません。 私の書いた Ajax のコードがおかしいんでしょうか。 どなたか御指導下さい。 よろしくお願いします。 // 追加登録処理 function doActionAdd(){ if(dataCheck()){ // customerId が 空白か否かのチェック if($('#customerId').val() == ""){ if(window.confirm("追加登録していいですか?")){ if(!doubleCheck()){ window.alert("重複はありませんでした"); }else{ window.alert("重複があったので登録できません。"); }  (以下略) function doubleCheck(){ var yomi = $('#customerYomi').val(); var res = ''; // 重複チェック $.ajax({ type: "POST", url: "../customer/CustomerDoubleCheck.php", data: {"customerYomi":yomi}, dataType: 'text', // ajax通信が成功したときの処理 success: function(request){ console.log("request=========" + request); var json = JSON.parse(request); console.log(json[0].result ); res = json[0].result; console.log("res=========" + res); }, error: function(XMLHttpRequest, textStatus, errorThrown){ $('div#jobStatus').text("重複チェック検索ができませんでした。"); return false; } }); console.log("resその2=========" + res); //※※※ if(res == "yes"){ // 重複していたので「false」を返す。 return false; }else{ // 重複していなかったので「true」を返す。 return true; } }