33

JQuery が link_to メソッドに対して 2 つの AJAX リクエストを作成しているという奇妙な問題があります。UJS 用の JQuery を使用して Rails 3 アプリを開発しています。「フォロー」と「フォロー解除」を切り替えるトグル リンクがあります。

私のリンクは次のようにレンダリングされます。

<span id="follow_link">
  <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a>
</span>

私のコントローラーは次のようにセットアップされています:

def tfollow_artist
  @artist = Artist.find(params[:id])
  if current_user.following?(@artist) 
    current_user.stop_following(@artist)
  else 
    current_user.follow(@artist)
  end
 end

最終的に js を次のようにレンダリングします。

 $('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');

これは本質的に、'<span id="follow_link">...</span> の html コンテンツを同じ URL に置き換え、テキストが異なるだけです。たとえば、上記は次のようにレンダリングされます。

<span id="follow_link">
  <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a>
</span>

ただし、これにより、何らかの理由で JQuery が 2 つの AJAX リクエストを作成することになります。

ここで何が悪いのか誰にもわかりますか?

最新のjquery-ujsファイルをアプリにコピーする「jquery-rails」gemを使用しています。JQuery のバージョンは 1.4.3 です

4

11 に答える 11

27

このダイアログのおかげで:

https://github.com/rails/jquery-ujs/issues/208

jquery と jquery_ujs が 2 回含まれていることがわかりました。

jquery-rails gem が自動的にそれらを application.js に入れると思いますが、それを application.js にも含めました。

なんらかの理由で、application.js は app/assets/javascripts/ のすべてを自動的にバンドルするようです -必要なものをすべて削除しても。

したがって、:remote => true フォームが 2 回送信される場合は、application.js を確認してください。

お役に立てれば!

更新:これは、ダイジェストを使用せずにアセットを事前にレンダリングしたことに関係があると思われるため、開発環境が app/assets/application.js の要件から動的に HTML ヘッドにスクリプト タグを追加すると、 public/assets からの静的なものが読み込まれることを除いて、空の動的な application.js であるべきものにも 1 つ追加します。混乱しますか?うん!

于 2011-10-15T13:21:06.683 に答える
17

私は同じ問題を抱えていましたが、この行にコメントすることで修正されました

\#config.assets.debug = true

開発モードで

于 2011-11-19T19:51:34.473 に答える
3

あなたの JavaScript がブラウザによるリンクの実行を止めていないことが原因だと思います。したがって、AJAX リクエストを取得してからブラウザ リクエストを取得します。

これについては、Rails Cast 174 に説明と解決策があります。テキストの説明はこちら、ページの約 3/4 です。

于 2010-11-20T09:42:35.647 に答える
2

私は同じ問題を抱えていました: :remote => true を使用するとリクエストが重複します。私の問題は、Heroku の使用とアセットのプリコンパイルが原因でした。Heroku にデプロイする前にアセットをプリコンパイルしています (rake assets:precompile)。これにより、基本的に、パブリック フォルダーにアセット パイプラインの複製コピーが作成されます。したがって、Docuext で述べられているのと同じことが起こっていました。各リクエストを処理する複数の JavaScript ファイルがありました。

ローカルで作業しているときに public ディレクトリのアセットを削除すると修正されます (git rm -rf public/assets)。public ディレクトリからアセットを削除した後、複数のリクエストの送信を停止しました

于 2012-06-05T11:48:07.720 に答える
1

また、私にとって同じ問題:link_toでXMLHttpRequestを2回... :remote => "true"

私は解決しました

locals/application.rb :

コメントすることで

// config.assets.paths << Rails.root.join('vendor','assets','stylesheets','javascripts')

そしてコメントを外します

config.action_view.javascript_expansions[:defaults] = %w(jquery jquery-ui アプリケーション)

それから、最後の git pull の後に行うのを忘れていました。誰かを助けてほしい。

于 2015-10-13T16:03:35.103 に答える
1

このコードを試してください....リモートリンクのダブルクリックを防ぎます..

$('a[data-remote=true]').live('ajax:before', function () {
   if ($(this).attr('ajax-loading')) {
     return false;
   } else {
     $(this).attr('ajax-loading', true);
   }
}).live('ajax:complete', function () {
  $(this).removeAttr('ajax-loading');
});

要旨

于 2012-04-25T06:45:56.497 に答える
0

私は今同じ問題に直面しました。すべてのコードの変更をチェックアウトし、他のことを試しましたが、役に立ちませんでした。最後にブラウザのキャッシュをクリアしました。それは助けました。

于 2012-10-10T14:06:08.250 に答える
0

:defaults として使用する JavaScript ファイル (application.js は常に含まれます)。

 config.action_view.javascript_expansions[:defaults] = %w(jquery rails)

コメント行は、application.js が常に含まれていることを明確に示しています。私のアプリケーションでは、デフォルトでアプリケーションを追加しました。したがって、ajax .submit の場合、アプリケーションで 2 つのレコードが作成されました。

于 2011-11-29T05:27:50.890 に答える
0

ユージーンの答えに基づいて、プロダクション用のアセットをローカルでプリコンパイルした後に開発している場合は、次のように注意してください...

bundle exec rake assets:precompile RAILS_ENV=production

...その後、開発を続けると、Rails AssetPipeline は未コンパイルのアセットとコンパイル済みのアセットの両方を提供する必要があります

これを修正する 1 つの方法は、Eugene の Rails の標準の rake タスクを使用することです。別の方法は、これらの厄介なプリコンパイルされた本番環境対応のアセットを次のようなもので単純に削除することです

$ rm -rf #{Rails.root}/public/assets
于 2015-07-19T11:42:08.423 に答える
0

ujs ファイルが 2 回ロードされた場所を見つけることができない場合は、このコードを rails.js / application.js にコピーするだけです (できればここにはありません)。

var alreadyInitialized = function() {
    var events = $(document).data('events');
    return events.click && $.grep(events.click, function(e) { return e.namespace === 'rails'; }).length;
    }

if ( alreadyInitialized() ) {
    $.error('jquery-ujs has already been loaded!');
}
于 2013-11-21T08:01:29.713 に答える