Posted at

RailsでAjaxリクエストが2回行ってしまうときにチェックすべき3つの事

More than 5 years have passed since last update.


1. jQueryを2回読み込んでいないか確認する

Rails3.1からAsset Pipelineが導入されたため、誤ってjQueryを2回読み込んでしまっている、なんて事故が起こりがちなようです。


  • まず、application.jsでrequire_treeしているときに、assets/javascript直下にjquery.jsを配置していないか確認する。

  • 上記を確認しても解消しない場合は、rake assets:precompileしたデータがpublic/assets以下にないか確認する。2回jQueryを読み込んでしまっていたスクリプトがそのまま残っているかも知れません。あったら削除してしまいましょう。

  • 再発防止のためにconfig/environments/development.rbに以下のコードを追加しても良いでしょう。

# Ignore /public/assets

config.serve_static_assets = false


2. イベントのバブリングで2回コールされていないか確認する

aタグにイベントを紐付けているときにありがちです。console.logを仕込んで確認をして、これが原因だった場合は以下のコードを追加しましょう。

$("a#hoge").live('click', function(event) {

// …いろんな処理…
event.stopPropagation();
});


3. dataTypeがscriptなのに、successコールバックでレスポンスをevalしていない確認する

実際には2回POSTしているわけではないのに、レスポンスのJavaScriptコードを2回評価してしまってはいないでしょうか。

$.ajax({

type: "POST",
url: url,
data: data,
cache: false,
dataType: "script",
success: function(data) {
// やらなくていい
eval(data);
};
});

レスポンスのJSは勝手に評価されるので、successコールバック内のeval(data)が余計ですね。削除しましょう。