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
,我最初写了<%= image_path 'jumbotron.jpeg' %>
,它触发了错误。后来我注意到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 参数时是否遇到任何错误?
如果您将<%= image_path 'jumbotron' %>
更改为<%= image_path 'jumbotron.jpeg' %>
您需要完整的文件名会发生什么
【参考方案1】:
如果你改变了会发生什么
<%= image_path 'jumbotron' %>
到
<%= image_path 'jumbotron.jpeg' %>
您需要完整的文件名
【讨论】:
谢谢,解决了!实际上,原始图像(在编译它们之前)有一个.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中的多个数据库?
Rails 6中的protect_from_forgery?