Jquery rails3ujs-controller被link_调用两次到:remote

Jquery rails3ujs-controller被link_调用两次到:remote,jquery,ruby-on-rails-3,ujs,Jquery,Ruby On Rails 3,Ujs,我遇到了一个奇怪的问题,JQuery为link_to方法创建了两个AJAX请求。我正在用JQuery为UJS开发一个Rails 3应用程序。我有一个切换链接,可以在“跟随”和“取消跟随”之间切换 我的链接呈现如下: <span id="follow_link"> <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow

我遇到了一个奇怪的问题,JQuery为link_to方法创建了两个AJAX请求。我正在用JQuery为UJS开发一个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>
最终将js呈现为:

 $('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');
$('follow#u link').html('follow')%>;
它基本上替换了“。。。使用相同的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发出两个AJAX请求

有人能看出这里出了什么问题吗


我正在使用“jquery rails”gem,它正在将最新的jquery ujs文件复制到我的应用程序中。JQuery版本是1.4.3

我认为发生的事情是JavaScript没有阻止浏览器执行链接。因此,您得到的是AJAX请求,然后是浏览器请求

Rails Cast 174对此有一个解释和解决方案。文本说明,约占页面向下的3/4。

感谢此对话框:

我发现jquery和jquery_js被包含了两次

我猜jquery rails gem会自动将它们放入application.js,然后我也将它们包含在application.js中

无论出于什么原因,application.js都会自动绑定app/assets/javascripts/中的所有内容,即使我删除了所有要求

因此,如果您的:remote=>true表单提交了两次,请尝试检查application.js

希望这有帮助


更新:我相信这可能与我在不使用摘要的情况下预呈现我的资产有关,因此,当我的开发环境从app/assets/application.js中的requires动态地在html头部添加脚本标记时,它还为应该是空的dynamic application.js添加了一个脚本标记,除了从public/assets加载的静态文件。令人困惑是的

我也有同样的问题,通过评论这一行来修复

\#config.assets.debug = true
在开发模式下

JavaScript文件,您希望其为:默认值(始终包括application.js)。 注释行清楚地表明始终包含application.js。
在我的应用程序中,我添加了默认值中的应用程序。所以对于ajax.submit,它在我的应用程序中创建了两条记录

试试这段代码。。。。防止双击远程链接

$('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');
});

我遇到了同样的问题:使用:remote=>true时请求重复。我的问题是由于使用Heroku和预编译资产。我在部署到Heroku之前预编译资产(rake资产:预编译)。这实际上会在公用文件夹中创建资产管道的副本。因此,正如Docuunet所提到的,发生了同样的事情:有多个javascript文件处理每个请求


如果我在本地工作时删除公共目录中的资产(git rm-rf public/assets),它就会得到修复。从公共目录中删除资产后,它停止发送多个请求

我刚才遇到了同样的问题。检查了所有代码更改并尝试了其他方法,但均无效。最后清除了浏览器缓存。这很有帮助。

我也有同样的问题。运行以下rake任务解决了我的问题

rake tmp:clear
rake assets:clean

如果您无法两次找到ujs文件的加载位置,只需将此代码复制到rails.js/application.js(最好不要在这里)


基于Eugene的答案,请注意,如果您是在本地预编译了用于生产的资产之后进行开发的,例如

bundle exec rake assets:precompile RAILS_ENV=production
…然后,在继续开发时,Rails AssetPipeline将同时为未编译和已编译的资产提供服务

解决这个问题的一种方法是使用Eugene的Rails标准rake任务。另一种方法是简单地用类似于

$ rm -rf #{Rails.root}/public/assets

对我来说也是同样的问题:在一个 链接到…:远程=>“真”

我已经解决了,在

locals/application.rb

评论


//config.assets.path感谢您的链接和解释。这是有道理的。但是,在调用link_to:remote时进行远程调用的Javascript已经使用了“live”方法和“prevent”默认值(这是在jquery ujs'rails.js():$('a[data remote],input[data remote]').live('click.rails',function(e){$(this.callRemote();e.preventDefault();'));所以不确定这里是否还有其他东西。它不是取决于返回值吗?即使我面临这个错误。有解决方案吗?这里也有同样的问题。仍在寻找解决方案。问题同上。你有没有解决这个问题?也面临同样的问题…jquery rails版本1.0.16。这对我和副本都有效ajax调用被取消了,但出于某种原因,我不需要在我的其他工作站上执行此操作。此设置的作用是什么?我们为什么需要打开/关闭它,何时使用它?这仍然有效。有人知道他/她为什么会这样做吗?
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!');
}
bundle exec rake assets:precompile RAILS_ENV=production
$ rm -rf #{Rails.root}/public/assets