Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails应用程序正在请求生产中不存在的预编译资产_Ruby On Rails_Asset Pipeline - Fatal编程技术网

Ruby on rails Rails应用程序正在请求生产中不存在的预编译资产

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

我通过运行bundle exec rake assets在本地预编译资产:预编译并将它们提交到我的git repo。在使用Capistrano将其部署到生产服务器之后,我才意识到有些资产丢失了,但找到了一些其他资产,一切正常

我打开浏览器,查看页面源代码。我的应用程序似乎正在请求服务器中不存在的资产,如下所示:

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 */
}