生产环境下Rails 3.1资产已被指纹化,但渲染的HTML未被指纹化。

3
在开发环境中一切运作良好。并且使用Capistrano正常部署应用程序。资源(javascript和css)似乎被完全预编译,并且每个资源,包括图像,都被赋予了“指纹”。问题是,在视图中使用image_tag("image-name.png")时,生产环境中创建的html不包含“指纹”。
我们在生产环境中得到渲染的HTML:
<img alt="Image-name" src="/assets/image-name.png" />

我希望你能够替换成我所期望的内容,应该是:
<img alt="Image-name" src="/assets/image-name-b89cae2830c2901f844c353b3f3942fe.png" />

那么我们搞砸了Rails 3.1中的哪些配置选项呢?

编辑

有问题的图像似乎是我们使用的第三方Colorbox图像查看工具中包含的那些。Rails 3.1正在为其资产进行指纹处理(border.png等),但显然,该javascript库的源代码并没有使用像image_tag这样的助手。因此,在生产环境中,它仍然在寻找名为/assets/colorbox/border.png的图片。目前,这些图片位于/vendor/assets/images中,并在开发中正常工作。有没有办法防止仅对这些图片进行“指纹处理”?


可能想要查看这个问题,https://dev59.com/mFvUa4cB1Zd3GeqPpgob - basicxman
根据Rails指南的说法:“指纹行为由Rails中config.assets.digest设置控制(在生产环境中为true,在其他所有情况下为false)。” 因此,在生产环境中应假定config.assets.digest为* true ,而在其他任何地方都为 false *。或者我理解错了吗?!? - Meltemi
1
config.assets.digest = true 添加到 production.rb 中似乎只有部分帮助。它使一些图片(我的)正常工作。但是我们使用的第三方 JavaScript 工具中包含的一些图片仍然“损坏”。(请参见主帖中的编辑说明) - Meltemi
我遇到了同样的问题。我的生产环境中的图像没有指向指纹版本。 - Min Ming Lo
1个回答

1

好的,这是我如何黑掉第三方文件以使事情正常工作的方法:

有问题的图片在像vendor/assets/stylesheets/colorbox.css这样的文件中。我首先将文件的扩展名更改为.scss,然后将每个url(colorbox/image.png)更改为image_url("color box/image.png"),现在一切都很顺利。资产在开发中正常服务,在生产中进行指纹识别。

仍然想看到将第三方(供应商)JavaScript库和CSS添加到Rails 3.1应用程序的“正确”方法。Rails团队必须预见到不需要编辑即可实现的解决方案?所以,请随时提供其他解决方案。


顺便说一下:我之前手动配置了我的Capistrano配方,其中包括:

run "cd #{release_path}; RAILS_ENV=production bundle exec rake assets:precompile"

...以及它的伴随着after deploy:update_code ...。我现在已经删除了那些行,并且改为在我的Capfile中添加了load 'deploy/assets'。我不认为这会对上述问题产生任何影响,但我还是想记录一下,因为在Capistrano 2.8中不再需要添加自己的管道预编译配方,就像在3.1rc时代一样。


1
我遇到了完全相同的问题,我很惊讶目前关于这个问题还没有多少问题或博客文章。我在Railscasts.com的评论部分表达了完全相同的担忧,针对升级到Rails 3.1的情节,说了类似于你所说的话:为什么Rails团队没有预料到有图片的第三方库?我们不可能深入改变每个CSS文件中的url()。那看起来真的很糟糕。 - Nik So

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