重要更新:
我终于找到了真正的解决方案,也发现了真正的问题。在这里写下了很多无用的信息,考虑到实际问题,我将对问题进行大规模更新,以便其他人可以轻松地找到问题所在并看到解决方案。
问题: 这是由于Rails 3.1 的资源管道引起的。
实际上...这是一个简单的问题:在开发环境中,资源被呈现两次。经过大量调查,我发现我的 Rails 3.1 服务器从 "app/assets" 和 "public/assets" 文件夹中呈现了资源。因此,我有了每个 .js 和 .css 文件的副本,这破坏了所有我的 JavaScript 动画(是的...将相同的事件和处理程序绑定到同一元素两次通常不是您想要的)。
如果问题突然出现,那是因为我必须运行 "rake assets:precompile" 来部署我的应用程序。从那时起,在开发中运行我的应用程序时,服务器会呈现静态预编译资源和动态预编译资源。
解决方案 (下面有一个更好的) - 不过你还是可以继续阅读它
第一种方法:我只需删除公共文件夹中所有预编译的资源。
更好的方法:在 development.rb 中添加 config.serve_static_assets = false,这将防止从 /public/assets 加载文件。还要记得重置浏览器缓存。
[编辑:2012年7月20日]
高级方法:最近由于这些静态资源出现了一个新问题。你知道,当你使用 paperclip 或其他 gem 并且它们在某个系统子文件夹中添加了你的图像到公共文件夹中,因为如果你想使用 capistrano 部署你的应用程序,这样做会更好。嗯,那很好,但! 当我们添加 config.serve_static_assets=false 后,这些图像在开发中不会呈现,如果您想对它们进行一些 CSS 处理,那就糟糕了。那么该怎么办呢?
实际上,您需要在开发中打开静态资源,如下所示:
# Expands the lines which load the assets
config.assets.debug = true
config.serve_static_assets = true
然后为了防止Rails两次渲染其他已经预编译的资源,请执行以下命令:
rake assets:clean
这是与 rake assets:precompile 相反的操作,它会清理 public/assets 文件夹,以便 Rails 不会重复呈现您的资产。当然,每次预编译资产后,您仍然需要清除浏览器缓存和清除资产。[编辑:2013 年 11 月 18 日] - 来自 @idejuan 的答案
另一个解决方案:
您可以在 development.rb 中添加此行:
config.assets.prefix = '/dev/assets'
其中前缀可以是任何您想要的内容。脚本不会再加载两次,/public/system 中的图像将被读取!但要小心,因为它更改了您的“静态”资产路径...如果您从 gem 中引用资产,则可能无法在开发中正确加载它们...
[结束编辑]
剩下的问题和答案!
实际上,如果您在本地预编译资产,则 Rails 会默认在开发和测试环境中呈现来自 public 文件夹和 assets 文件夹的资产。通常,公共文件夹中的资产应该覆盖资产文件夹中的资产,但事实并非如此,即使它确实这样做,我们也会失去“debug_mode”的好处,因为我们每次都必须预编译资产。因此,在开发环境和测试环境中本地预编译资产时,资产会呈现两次。
因此,通过将“config.serve_static_assets = false”添加到您的 development.rb 文件中,您会覆盖默认行,告诉 Rails 在 public 文件夹中查找资产。希望有一天他们能对本地预编译的资产做出更干净的解决方案。
感谢帮助我进行调查的人们:)
Kulgar.