Rails没有预编译app/assets/images文件夹中的图像?

Paw*_*wan 16 ruby svg ruby-on-rails

我的app/assets/images文件夹中有一些图像(svg).根据Rails指南,资产文件夹中的所有文件都应自动进行预编译.

但是,当我使用图像引用时image_tag('filename'),它会显示Sprockets::Rails::Helper::AssetNotPrecompiled错误

Asset was not declared to be precompiled in production.

它告诉我声明要手动预编译的文件,但为什么这是必要的呢?最重要的是,当我在开发中做所有事情时,为什么它会关注生产环境?

Tim*_* B. 18

如果在开发中启动服务器后添加了映像,请重新启动服务器.然后链轮将预编译该图像,错误将消失.

  • @WardBekker我标记为接受的答案实际上是准确描述问题及其解决方案的答案.蒂姆的回答虽然对很多人来说是有效的(正如评论所见)对我来说并不适合. (2认同)

Ric*_*eck 7

我很确定Rails还不支持.svg,因此它会忽略它.

您需要在文件中包含文件扩展名config/application.rb:

#config/application.rb
config.assets.precompile += %w(.svg)
Run Code Online (Sandbox Code Playgroud)

关于与production环境有关的应用程序,您必须记住预编译过程适用于生产:

管道的第一个特性是连接资产,这可以减少浏览器呈现网页的请求数量.Web浏览器可以并行处理的请求数量有限,因此请求数量越少意味着应用程序的加载速度越快.

汇总资产本质上意味着将资产文件编译成单个文件,然后通常缩小.

-

虽然这可以实时完成,但它主要是静态资产的领域(必须预先编译).这意味着如果您运行rake asstes:precompile任务,它将在开发环境中工作,除非您调用RAILS_ENV=production rake assets:precompile(将其设置production为该请求的环境).

当我在开发中完成所有工作时,为什么它会关注生产环境

该应用程序将在生产中运行,而不是在开发中运行.

最终,您在开发过程中所做的一切都应该使生产中的工作变得更容易/更好.就您的资产而言,这意味着您可以使用许多Rails资产管道的怪癖,从链轮预处理器,如SASS和Coffeescript

  • 不,这不仅仅是 svg。即使是 app/assets/images 文件夹中的 png 图像也无法被 Rails 找到。我根本无法包含任何图像。我不明白为什么。我了解资产管道的工作原理,但对我来说很奇怪的是,Rails 不会包含资产,尽管声明所有非 css 和非 js 资产如果位于资产文件夹中,都会自动包含在内。 (2认同)

Ste*_*fan 5

这可能是因为您没有指定完整的图像名称。我更新gem后也遇到了这个问题。在我刚刚使用之前image_tag 'some-image',但似乎您现在必须指定要使用的图像/扩展名的类型。

尝试这个:image_tag 'some-image.svg'。这对我有用。

干杯。

  • 即使我输入了整个文件名,我也遇到同样的问题 (3认同)