Rails 3.1资产 - 开发环境下奇怪的服务

36

我在Rails 3.1的资产管道中遇到了问题。 在开发环境中资产被包含了两次:

<script src="/assets/main_new.js?body=1" type="text/javascript"></script>
<script src="/assets/pagenav.js?body=1" type="text/javascript"></script>
<script src="/assets/tours.controller.js?body=1" type="text/javascript"></script>
<script src="/assets/tours.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

Rails以某种方式编译并包含了application.js,因此所有的脚本都被包含了两次 - 作为单独的文件和在application.js中。

在生产环境中预编译的资产没有问题。

development.rb

 config.assets.compress = false
 config.assets.debug = true

production.rb

# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false

# Compress both stylesheets and JavaScripts
config.assets.compress = true
config.assets.js_compressor  = :uglifier
config.assets.css_compressor = :scss

config.assets.compile = false
config.assets.digest = true

application.rb

config.assets.enabled = true

3
尝试运行 rake assets:clean 命令。虽然开发模式下可能仍会提供 application.js 文件,但不应包含其他 JS 文件。 - firien
在删除public/assets中的资源后,不要忘记清除浏览器缓存。 - Nicolas Goy
5个回答

39

尝试将以下内容添加到 development.rb 文件中:

config.serve_static_assets = false

...然后清除浏览器缓存 (根据评论更新)

静态资源是指public/assets中的预编译资源,这也是rake assets:precompile命令的生成目录。

现在发生的情况是,如果你正在提供服务,则public/assets中存在的任何文件都会覆盖app/assets中的同名文件。所以当js标记想要引用app/assets/application.js时,实际上加载的是public/assets/application.js。


它仍然添加了application.js,但现在是空的。谢谢! - Fenelon
18
看到同样的问题出现在 rails 3.2 上,但这个解决方法对我不起作用。此外,由于这是一个全新的项目,public/assets 目录下也没有任何文件,并且我还没有运行过 rake assets:precompile 命令。你有什么好的想法来解决吗?在开发模式下,我必须使用 config.assets.debug = false 才能使我的 JavaScript 正常工作,这让我很烦恼! - Batkins
6
我已经向 Rails GitHub 问题跟踪器报告了这个问题。有人提交了一个拉取请求来修复它,但它尚未被接受。希望很快能够解决。如果您愿意,可以给它点个赞。 - Batkins
2
我遇到了与@Batkins(Rails 3.2)相同的问题,结果发现浏览器缓存是问题所在(因为我是新手使用mac,没有使用command + shift + R)。 - yorch
这个设置实际上是指 public/ 目录,并且早于资产管道。http://guides.rubyonrails.org/configuring.html - graywh
显示剩余3条评论

12

一旦你删除了 /public/assets 目录,你还必须清除浏览器缓存。


在Chrome中清除浏览器缓存解决了我的问题。谢谢! - Brian Armstrong

8

这让我遇到了一个问题。设置以下内容可以使应用程序运行,但包括单个application.js文件 - 我不想在开发中使用:

config.serve_static_assets = false

我之前已经预编译了我的资产(看起来是原因)。

为了解决它,我执行了以下操作:

  • 删除先前预编译添加的public/assets目录。
  • 运行RAILS_ENV=development rake assets:clean以清除tmp/assets
  • 编辑app/assets/application.js

仅在编辑了application.js后,出现错误并进行更正后,页面中包含的application.js才不是完整的预编译application.js。

我不确定是否需要完成所有这些步骤。一路上我也重新启动了我的服务器。


我认为需要编辑 app/assets/application.js 以强制浏览器重新加载它(否则会得到304)。在删除 public/assets 后,您也可以清除浏览器缓存。 - Nicolas Goy
这个特定的解决方案对我很有用。谢谢你。资产管道很酷,但它确实很脆弱。远非即插即用,但我们会做到的。 - Matt Schwartz
编辑application.js是我缺少的步骤 - 谢谢! - benz001

4

又一次被这个问题绊倒了 - 不要忘记在你的application.js文件中的所有//= require指令之后添加一个空行! 对于IT技术相关内容,建议注意细节并避免翻译解释性语句。


我最近因为硬盘崩溃而不得不重新设置我的开发环境,遇到了这个问题。出于某种原因,在最后一个指令的末尾添加另一行解决了它。 - zarazan
我的application.js已经有了一个空行,但是和上面的@zarazan一样,在末尾添加第二个空行就解决了。我还不能确定原因。 - Morris Singer
这真是太疯狂了。我加了那一行白色的代码就解决了问题,然后我又把那行删除了...但它还是可以正常工作... - richardaday

0

我遇到了少文件的同样问题。

这里有来自文档的解释:

在开发模式下,资源将按照清单文件中指定的顺序作为单独的文件提供。

我的解决方案是从application.css.less中删除*= require_tree .这一行,并仅使用@import "my-styles";从less中导入。

也许你可以在javascript中找到类似的解决方案...


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