Ruby on rails Rails应用程序正在请求生产中不存在的预编译资产
我通过运行bundle exec rake assets在本地预编译资产:预编译并将它们提交到我的git repo。在使用Capistrano将其部署到生产服务器之后,我才意识到有些资产丢失了,但找到了一些其他资产,一切正常 我打开浏览器,查看页面源代码。我的应用程序似乎正在请求服务器中不存在的资产,如下所示:Ruby on rails Rails应用程序正在请求生产中不存在的预编译资产,ruby-on-rails,asset-pipeline,Ruby On Rails,Asset Pipeline,我通过运行bundle exec rake assets在本地预编译资产:预编译并将它们提交到我的git repo。在使用Capistrano将其部署到生产服务器之后,我才意识到有些资产丢失了,但找到了一些其他资产,一切正常 我打开浏览器,查看页面源代码。我的应用程序似乎正在请求服务器中不存在的资产,如下所示: http://mywebsite.com/assets/users-97ff9cd1fc91c7ec829ef21dac3540b1.css 上面导致Firebug显示Network
http://mywebsite.com/assets/users-97ff9cd1fc91c7ec829ef21dac3540b1.css
上面导致Firebug显示NetworkError:404的URL未找到
然而,在生成预编译资产的“public/assets”路径中,名为users-97ff9cd1fc91c7ec829ef21dac3540b1.css的文件
它不存在
在my manifest.yml中,users.css文件实际上指向一个名为
用户-807c131fa112764e83fdbcd416b3f3fa.css
它存在于服务器中。因此,应将请求指定到此文件中
manifest.yml
正如您可能猜到的,URL应该指向该现有文件:
http://mywebsite.com/assets/users-807c131fa112764e83fdbcd416b3f3fa.css
如何纠正此问题?问题在于,它是Rails的标准功能
资产指纹
指纹识别是一种使文件名依赖的技术
关于文件的内容。当文件内容更改时
文件名也会更改。对于静态或不频繁的内容
更改后,这提供了一种简单的方法来判断
即使在不同的服务器或部署日期之间,文件也是相同的
这基本上意味着管道中的每个资产都将附加一个哈希键,以确保唯一性
为了适应这种情况,您需要使用诸如
动态引用
好消息是.css和.js都是在预编译后由Rails自动访问的,但是,如果要引用特定的资产文件(如图像),则必须动态地引用它们
我的意思是:
#app/assets/stylesheets/users.css
.hello {
background: url("google-home.png"); /* - doesn't work with precompiling, as references static object */
}
#app/assets/stylesheets/users.css.scss
.hello {
background: image_url("google-home.png"); /* - dynamic reference using one of the SASS Rails Helpers */
}
希望这有帮助?当应用程序使用capistrano部署时,以及当生产服务器共享/资产目录上的capistrano预编译资产符号链接到public/assets并且所有发布版本都可以访问应用程序的资产时 在这种情况下,您的存储库包含一个public/assets目录。 生产服务器上是否有共享/资产目录? 您能在旧版本中看到users-97ff9cd1fc91c7ec829ef21dac3540b1.css文件吗 我认为您有充分的理由在本地预编译您的资产,因此您可以尝试其他解决方案,如: 使用部署和rsync资产时在本地预编译资产 您的生产服务器。此解决方案描述如下: 或 在预编译之前清理资产: RAILS\u ENV=生产包执行rake资产:清理资产:预编译
希望这能有所帮助。对不起,这不是我想要的答案。祝你好运找到解决办法:嗨,medBo!回答问题有助于我更好地掌握Rails,所以我尽量每天至少花几个小时回答问题!
#app/assets/stylesheets/users.css
.hello {
background: url("google-home.png"); /* - doesn't work with precompiling, as references static object */
}
#app/assets/stylesheets/users.css.scss
.hello {
background: image_url("google-home.png"); /* - dynamic reference using one of the SASS Rails Helpers */
}