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

时间:2015-12-26 13:00:55

标签: ruby-on-rails ruby svg

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

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

Asset was not declared to be precompiled in production.

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

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:7)

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

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

#config/application.rb
config.assets.precompile += %w(.svg)

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

  

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

重新整合资产本质上意味着将资产文件编译成单个文件,通常是minified

-

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

  

当我在开发中做所有事情时,为什么它会关注生产环境

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

最终,您在开发过程中所做的一切都应该让您更容易/更好地在生产中工作。就您的资产而言,这意味着您可以使用Rails的资产管道的许多怪癖,从sprocketspreprocessors such as SASS & Coffeescript

答案 2 :(得分:4)

这可能是因为您没有指定完整的图像名称。我也在更新gem之后遇到了这个问题。在我刚使用IntegerProperty status = new SimpleIntegerProperty( ); Label label = new Label( ); status.addListener( ( observable, oldValue, newValue ) -> { label.setText( newValue.intValue( ) == 1 ? "Active" : "Inactive" ); } ); 之前,您似乎现在必须指定要使用的图像/扩展名类型。

试试这个:IntegerProperty status = new SimpleIntegerProperty( ); Label label = new Label( ); label.textProperty( ).bind( Bindings.createStringBinding( ( ) -> status.intValue( ) == 1 ? "Active" : "Inactive", status ) ); 。它对我有用。

干杯。