16

好的,所以我已经看到这个问题是由 jQuery 或 Prototype 的多个链接引起的,但我可以确认我在整个页面上只链接到 jQuery一次。我的问题是这样的:当我link_to确认删除时,弹出窗口显示两次。这是我模板中的适用代码(用 Slim 编写):

link_to('Destroy', depot_path(@depot.id), :confirm => "Really?", :method => :delete)

我在打开资产管道的情况下运行Rails 3.1.0gem 'jquery-rails' ,在我的文件Gemfile中,以下是我的application.js文件(由 Sprockets 为资产管道编译)。

//= require jquery
//= require jquery_ujs
//= require 'underscore'
//= require 'backbone' 

我有underscore.jsandbackbone.js在我的/vendor/assets/javascripts/目录中,并且 sprockets 似乎可以找到那些。我还搜索了application.jssprockets 提供的文件,jQuery 只存在一次,jQuery UJS 只存在一次。这就是我的页面呈现时的样子(我省略了csrf-token显示的值,FWIW)。

<head>
  <meta content="text/html; charset=utf-8" http-equiv="content-type">
  <title>Administration</title>
  <link href="/assets/screen.css" media="screen" rel="stylesheet" type="text/css" />
  <script src="/assets/application.js" type="text/javascript"></script>
  <meta content="authenticity_token" name="csrf-param" />
  <meta content="--token--omitted--" name="csrf-token" />
  <script src="/assets/common/subdata.js" type="text/javascript"></script>
  <link href="/assets/show.css" media="screen" rel="stylesheet" type="text/css" />
</head>

subdata.js有一些特定于 Backbone 的代码;没有什么会选择再次包含 jQuery。那么有什么关系呢?我的项目中的任何地方都没有额外的 jQuery 文件;这一切都是通过jquery-railsgem 管理的。是什么导致我的:confirm方法触发两次?

编辑:我以前在 Rails 3.1 的 RC5 上看到过这个,但现在我也在 Rails 3.1 上看到过。

4

4 回答 4

25

这发生在我身上,因为我rake assets:precompile在我的开发环境中运行导致public/assets/application.js被创建。这使得请求 /assets/application.js由这个静态文件提供服务,该文件包含一起编译的所有// require脚本public/assets/application.js,导致它们再次被加载。

在开发模式下<%= javascript_include_tag "application" %>会扩展为多个<script>标签,一个用于每个文件所需的// require行,一个用于application.js仅包含其自己的内容的标签。

解决方案是手动删除整个public/assets目录或使用assets:cleanrake 任务。这将导致再次动态提供脚本文件。

于 2011-11-28T21:32:30.760 回答
4

这也发生在我身上。删除“//= require_tree 。” 从 application.js 修复它。

于 2011-11-07T05:03:53.120 回答
0

如果仍然没有锻炼,请在 application.js 中使用版本提及 jquery 和 jquery_ujs 的名称,然后使用 jquery 和 jquery_ujs 的压缩版本。

或者

将 gem 'jquery-rails' 添加到您的 gemfile 中,然后尝试。

于 2011-11-24T11:42:39.723 回答
-1

可能你有 rails.js 文件。删除它并重试。它必须工作。

FON

于 2011-10-04T15:21:40.600 回答