Rails 6 中的 ActionView::Template::Error(资产管道中不存在资产。)

Posted

技术标签:

【中文标题】Rails 6 中的 ActionView::Template::Error(资产管道中不存在资产。)【英文标题】:ActionView::Template::Error (The asset is not present in the asset pipeline.) in Rails 6 【发布时间】:2020-07-19 06:41:10 【问题描述】:

我在 app/assets/images 文件夹中放置了一个图像“jumbotron.jpeg”,我在视图中使用它:

<div class="jumbotron" style="background: url(<%= image_path 'jumbotron' %>);  no-repeat center center fixed;">

它在开发中运行良好,但是当我推送到生产环境时,我遇到了这个错误:

ActionView::Template::Error (The asset "jumbotron" is not present in the asset pipeline.):

这里有另一个主题指的是同样的问题:Rails - Asset is not present in asset pipeline when using image_tag

我找到的解决方案是在config/environments/production.rb 中将以下设置为true:

  config.assets.compile = true

它确实有效,但它使页面加载非常缓慢。这篇文章还解释了为什么将 config.assets.compile 设置为 true 是一个坏主意:https://***.com/a/8827757/11293450

所以我尝试做的(在设置回config.assets.compile = false 之后)是在本地预编译资产(参见https://guides.rubyonrails.org/asset_pipeline.html#local-precompilation)。

我更改了config/environments/production.rb 以添加这一行:

  config.assets.prefix = "/dev-assets"

然后跑:

rake assets:precompile 

它在 public/folder 中创建了一个 dev-assets 文件夹。

我在服务器上部署之前将文件推送到版本控制:

    git push 从我的本地环境到 Github git pull 在我的生产服务器(VPS)上,然后: bundle install --deployment --without development test bundle exec rake assets:precompile db:migrate RAILS_ENV=production passenger-config restart-app $(pwd)

但我仍然遇到同样的错误:

ActionView::Template::Error (The asset "jumbotron" is not present in the asset pipeline.):

编辑:解决方案如下所述,需要文件的全名。作为旁注,原始文件是.jpeg,我最初写了&lt;%= image_path 'jumbotron.jpeg' %&gt;,它触发了错误。后来我注意到Rails实际上将文件扩展名从.jpeg更改为.jpg

如上所述here:

从 3.0 开始,JPEG 会自动转换为 .jpg(两者都与实际 预编译和沙盒预编译错误)。如果你有东西 像 image_tag('image.jpeg'),它与 ​​AssestNotPrecompiled 中断 错误。将文件重命名为 image.jpg 将修复它。

【问题讨论】:

你是如何部署的?如果使用 capistrano,那么资产将在 cap 生产部署中编译。无需从您的 VPS 中提取代码,您只是覆盖了您刚刚推送到 git 的所有更改。您的过程似乎很奇怪 我编辑了问题以使其更清楚:我在服务器上运行 git pull 以从 Github 获取代码。目前我没有使用 capistrano,以上 1 到 5 点是我从开发到生产的实际部署方式。 你能把bundle exec rake assets:precompile的输出贴出来吗?另外,您的 jpeg 是否存在于您的 VPS 上? 好的。那么您在使用 RAILS_ENV=production 参数时是否遇到任何错误? 如果您将&lt;%= image_path 'jumbotron' %&gt; 更改为&lt;%= image_path 'jumbotron.jpeg' %&gt; 您需要完整的文件名会发生什么 【参考方案1】:

如果你改变了会发生什么 &lt;%= image_path 'jumbotron' %&gt;&lt;%= image_path 'jumbotron.jpeg' %&gt;

您需要完整的文件名

【讨论】:

谢谢,解决了!实际上,原始图像(在编译它们之前)有一个.jpeg 扩展名。但是 Rails 将它们转换为 .jpg,这可能是最初的问题。 @NZisKool 很高兴您解决了问题。我可以谦虚地建议您不要 git pull 进行部署,您将面临巨大的头痛。我不知道你的 .gitignore 里有什么,但有很多理由让你不应该这样做 感谢您的建议。我应该改用 capistrano 吗? @nziskool 现在有许多不同的 Rails 部署选项,但 Capistrani 可能是其中最成熟的。需要花点时间了解一下,但一旦学会并编写脚本,就可以在本地机器上的命令行中进行部署。那里有很多帮助。 capistrano-rails gem 是你的朋友 我们也遇到了这个问题,特别是使用 .jpeg 扩展名。将 .jpeg 重命名为 .jpg 修复了它,但这是一个多么奇怪的问题!

以上是关于Rails 6 中的 ActionView::Template::Error(资产管道中不存在资产。)的主要内容,如果未能解决你的问题,请参考以下文章

如何打开rails控制台以访问rails 6中的多个数据库?

6--Rails架构中的资源2

Rails 6中的protect_from_forgery?

Rails 6:Ajax 不接受 js.erb 中的渲染

如何将 Rails 6 中的 JqTree 与 webpacker 集成,树不是函数

Rails 6将输入添加到页面中的列表