33

我有一个奇怪的问题,JQuery 正在为 link_to 方法创建两个 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") %>');

它本质上用相同的 URL 替换了 '<span id="follow_link">...</span> 的 html 内容,只是文本不同。例如,上面现在将呈现为:

<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

4

11 回答 11

27

感谢这个对话框:

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

我能够发现 jquery 和 jquery_ujs 被包含两次。

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

似乎无论出于何种原因,application.js 都会自动将所有内容捆绑在 app/assets/javascripts/ 中——即使我删除了所有要求。

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

希望这可以帮助!

更新:我相信这可能与我在不使用摘要的情况下预渲染我的资产有关,所以当我的开发环境根据 app/assets/application.js 中的要求动态地在 html 头中添加脚本标签时,它还为应该是空的动态 application.js 添加了一个,除了来自 public/assets 的静态的被加载。令人困惑?是的!

于 2011-10-15T13:21:06.683 回答
17

我有同样的问题,通过评论这一行来解决

\#config.assets.debug = true

处于开发模式

于 2011-11-19T19:51:34.473 回答
5

我有类似的问题。运行以下 rake 任务解决了我的问题。

rake tmp:clear
rake assets:clean
于 2013-05-17T12:45:19.700 回答
3

我认为正在发生的事情是您的 JavaScript 没有阻止浏览器执行链接。所以你得到 AJAX 请求然后是浏览器请求。

Rails Cast 174 中有对此的解释和解决方案。文本解释here,大约是页面的3/4。

于 2010-11-20T09:42:35.647 回答
2

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

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

于 2012-06-05T11:48:07.720 回答
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 回答
1

对我来说也是同样的问题:link_to 上的两次 XMLHttpRequest ... :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 回答
0

我刚才遇到了同样的问题。检查所有代码更改并尝试其他方法但无济于事。终于清除了浏览器缓存。这有帮助。

于 2012-10-10T14:06:08.250 回答
0

您想要的 JavaScript 文件为 :defaults(始终包含 application.js)。

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

注释行明确表示始终包含 application.js。在我的应用程序中,我在默认值中添加了应用程序。所以对于 ajax .submit 它在我的应用程序中创建了两条记录。

于 2011-11-29T05:27:50.890 回答
0

如果你找不到两次加载 ujs 文件的位置,只需将此代码复制到 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 回答
0

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

bundle exec rake assets:precompile RAILS_ENV=production

...那么随着您继续开发,Rails AssetPipeline 将希望为的未编译资产已编译资产提供服务。

解决它的一种方法是使用 Eugene 的 Rails 的标准 rake 任务。另一种方法是简单地删除那些讨厌的预编译生产就绪资产,例如

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