Ruby On Rails 3.1 - 资产管道 - 资产被渲染两次

21

重要更新:

我终于找到了真正的解决方案,也发现了真正的问题。在这里写下了很多无用的信息,考虑到实际问题,我将对问题进行大规模更新,以便其他人可以轻松地找到问题所在并看到解决方案。

问题: 这是由于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.

4
没有人可以帮助你:因为你没有提供任何错误信息,甚至没有告诉我们你的应用程序的结构。我们甚至不知道你是否遇到了服务器端或客户端的错误! - Marnen Laibow-Koser
1
如果它的行为很奇怪,那么它正在做一些它不应该做的事情,或者它没有做它应该做的事情。如果两种情况都不是问题所在,那么你就没有问题。那么...你的问题是什么? - Marnen Laibow-Koser
但是...我已经解释了我使用了相同的代码,它在我的问题中:“所以...我决定下载我的上传源并将它们放在我的Ubuntu系统上。但是当我启动rails服务器时,奇怪的JavaScript行为再次发生。所以我确定它与我的应用程序代码无关,因为它在上传的应用程序和Windows环境下都可以正常工作。”我正在使用相同的浏览器。我确定问题出现是因为我更新了Ubuntu... - Kulgar
我的错误,漏掉了那句话。抱歉。再问一遍,你在两种情况下使用的是同一款浏览器吗? - Marnen Laibow-Koser
是的,我做过,并且在之前的Ubuntu版本上运行良好... - Kulgar
显示剩余5条评论
4个回答

10

你可能想要查看

https://dev59.com/k2sz5IYBdhLWcg3wsaAN#7854902

"将 config.serve_static_assets = false 添加到 development.rb 中,可以防止从 /public/assets 加载文件"

我认为这比你在这里提出的方案更好。


2
谢谢!它也起作用了!当然,我还必须做这个:"这是一个缓存问题,请重置浏览器缓存。在我弄清楚之前,我之前也遇到过这个问题",这也在你指向的另一篇帖子中提到了。 - Kulgar
1
我也遇到过这种情况。浏览器缓存是问题的原因。 - channa ly

3
我有同样的问题,并找到了一个简单的解决方案/技巧。我只需添加这一行代码:
config.assets.prefix = '/dev/assets'

将前缀设为任何你想要的内容,我将其设置为 /dev/assets 以避免进一步混淆,这可以在 development.rb 中完成。

脚本不再重复加载,并且我可以使用 /public/system 中的图像,而在尝试 config.serve_static_assets = false 解决方案时无法读取这些图像。

到目前为止,我还没有发现这种解决方案的缺点。希望这也能对你有所帮助!


这是一个很棒的解决方案!请允许我将其添加到我的帖子中。 :) - Kulgar
谢谢@Kulgar!当然,我很高兴它对你有用。 - idejuan
顺便提一下,这个问题也在这里有讨论 https://github.com/rails/rails/issues/10091,我也在那里发布了这个解决方案。 - idejuan

2
我看不出Ubuntu升级与您的JavaScript有任何关联。您是使用静态JavaScript?动态JavaScript?CoffeeScript?如果是后两者之一,我认为可能是升级破坏了处理JS的某个工具...
一些尝试方法:
- 在浏览器中查看JavaScript源代码。确保相同的源代码到达您的浏览器。 - 尝试在不同的系统上运行Rails应用程序(也许安装第二个带有不同Ubuntu版本的虚拟机,并查看是否能够复制问题)。 - 三次确保在两个地方都有完全相同版本的应用程序代码。

好的...我做了一个新的“编辑”(编辑3)。对不起,我的英语不太好...您认为问题可能源于其中一个gem的更新(例如JQuery-rails)吗? - Kulgar
也许可以比较一下你的 Gemfile.lock 文件,看看它们是否不同。你有收到任何 JS 错误吗?(顺便说一句,你的英语很好。) - Marnen Laibow-Koser
没有...我用firebug搜索了任何JS错误,但没有找到什么...然后...在编辑后,我更改了我的gemfile,在每个宝石中指定了与远程应用程序的Gemfile.lock中相同的版本。没有任何变化...在更新我的问题之前,我正在尝试其他方法。 - Kulgar
你在修改 Gemfile 后是否执行了 bundle 命令?你是否按照我建议的比较了 Gemfile.lock 而不是 Gemfile?你是否已经使用了合适的版本控制工具? - Marnen Laibow-Koser
我已经安装好了Git ^^。我进行了bundle操作。对于Gemfile.lock的比较,以下几个gem存在一些差异:"ansi, coffe-script-source, polyglot, tzinfo",仅此而已...但是如果我使用"-e production"选项启动服务器,为什么它能正常工作呢?(我添加了我的开发配置设置) - Kulgar
显示剩余3条评论

2

我建议您运行Rails服务器并传递不同的环境参数。这可能与您为开发设置的环境设置有关。

rails server -e production

如果问题消失了,那么它与您的“开发环境”配置设置有关。


嗯,好的,这真的很奇怪...因为如果我在生产环境中启动服务器,它就可以正常工作。 - Kulgar
要么在这里发布您的生产配置文件,如果可以的话,或者只是比较一下,并将开发配置文件替换为生产配置文件,以排除配置文件的可能性。 - mithun_daa
我进行了一次编辑,我找到了解决方案!非常感谢你们两个!^^很奇怪,显然在development.rb中,调试选项默认必须设置为false,但实际上并没有...这似乎是问题的根源。这很奇怪,不是吗? - Kulgar
为什么这很奇怪?显然,您的资源 - 在这种情况下是您的JS - 依赖于被压缩以正常运行。这是不好的。通过Firebug或其他工具查找JS并找出问题所在。 - Marnen Laibow-Koser
很奇怪,因为我以前从未更改过该选项,也从未更改过我的JS文件,一切都正常工作。那么,为什么现在会出问题呢...这就是我觉得奇怪的地方^^。 - Kulgar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接