宝石更新后:测试失败,“资产未声明为在生产中预编译”

Posted

技术标签:

【中文标题】宝石更新后:测试失败,“资产未声明为在生产中预编译”【英文标题】:After gem update: test fail with "Asset was not declared to be precompiled in production" 【发布时间】:2016-03-24 11:34:47 【问题描述】:

由于我更新了几个 gem,所有测试都因错误而失败:

ActionView::Template::Error: 资源未被声明为预编译 正在生产中。

Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb ) 添加到config/initializers/assets.rb 并重新启动您的服务器

app/views/layouts/_faviconsheader.html.erb:14:in _app_views_layouts__faviconsheader_html_erb__1320

app/views/layouts/application.html.erb:21:in _app_views_layouts_application_html_erb__4340

错误似乎是指包含以下行的部分_faviconsheader.html.erb

<%= content_tag :link, nil, rel: :manifest, href: image_path("favicons/manifest.json.erb") %>

这个部分被加载到application.html.erb:&lt;%= render partial: 'layouts/faviconsheader' %&gt;

知道是什么导致了这个错误,该怎么办? 在 gem 更新之前,所有测试都通过了。

我使用 Rails 4.2.5。更新的 gem 之一是 sprockets(将 sprockets 更新到版本 3.5.2)。我在github 上读到一些关于 sprockets 4 有问题的内容,但我没有使用版本 4。


附:即使我将Rails.application.config.assets.precompile += %w( favicons/manifest.json.erb ) 添加到config/initializers/assets.rb,错误仍然存​​在。但即使这样可行,我也想了解为什么会出现这个问题,除了更新一些 gem 之外没有任何更改。

【问题讨论】:

【参考方案1】:

长答案+解释

我认为正确的解决方法是按照错误消息的建议将文件添加到预编译资产中。也许这并不能为您解决问题,因为您有一个需要在运行时呈现的 erb 文件。我想如果该文件是静态 json 文件,那么在将其添加到预编译资产后,您将不会再遇到此问题。

当您使用 image_path 帮助程序时,Sprockets 会假设您有一个静态资产。您的应用在sprockets-rails 3.0 之前没有引发错误这一事实有点令人惊讶。显然,这个新版本在执行标准方面做得更好。 (看起来 3.0 还存在其他问题,可能很快会更新)

如果您需要在清单中包含 erb,那么最好使用路由路径助手而不是 image_pathasset_path 来获取 url。这将要求您将清单路由添加到您的 config/routes.rb 文件并通过控制器操作呈现 json 文件。视图文件将是您的 .erb 清单。


简答

在执行bundler update 将我的sprockets-rails 版本从 2.3.3 更改为 3.0.0 之后,这开始发生在我身上。一个简单的解决方法是将您的 Gemfile 中的 sprockets-rails 恢复到版本 2.3.3 并再次运行 bundle install

gem 'sprockets-rails', '2.3.3'

顺便说一句:我在开发环境中遇到了这个问题,并且能够通过运行rake assets:precompile 来修复它。不幸的是,它没有让我的测试通过。

【讨论】:

是的,这对我来说也是造成/解决了它。谢谢! Sprockets 3.0 也为我做到了 在我的情况下,将 Gemfile 修改为 gem 'sprockets-rails', '2.3.3' 并运行 bundle update sprockets-rails ,然后修复。 这条评论在 2016 年 8 月拯救了我的后端,在旧应用程序上升级到 Rails 5 并且 sprockets 升级破坏了所有事情。谢谢!!!!【参考方案2】:

虽然人们给出了很长的答案,但我建议非常简单明了的答案 去吧

config/initializers/assets.rb

添加以下行

Rails.application.config.assets.precompile += %w( style.css )

style.css 可以替换为您的任何 css 文件名

【讨论】:

【参考方案3】:

我遇到了类似的错误。 我没有修改 assets.rb 或任何东西,只是重新启动我的服务器,没有错误了。


ActionView::Template::Error(资产未声明为在生产中预编译。 将Rails.application.config.assets.precompile += %w( rails.png ) 添加到config/initializers/assets.rb 并重新启动您的服务器): 10: 11: 12: 13: http://rubyonrails.org/' %> app/views/static_pages/home.html.erb:13:in `_app_views_static_pages_home_html_erb___1806898863626708249_70312070486240'

【讨论】:

【参考方案4】:

我遇到了类似的错误,必须编辑 manifest.js 文件才能使其正常工作。

编辑/assets/config.manifest.js,然后

// manifest.js
//= link_tree ../images
//= link_tree ../stylesheets .css

然后做一个bundle exec rake assets:precompile

【讨论】:

这对我有用!出于某种原因,尽管我的文件具有扩展名 .scss,但我仍然不得不在 manifest.js 中使用它://= link_tree ../../../vendor/assets/stylesheets .css(注意 css 扩展名)。我不知道为什么,但没有它就行不通

以上是关于宝石更新后:测试失败,“资产未声明为在生产中预编译”的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯:失败后是不是可以完成测试

红宝石在铁轨上。部署失败,因为未找到 markerclusterer

华为审核被拒:检查HMS Core更新失败

手动测试Ruby CLI

更新旧宝石到现在

在雪豹中安装 mysql 失败