4

我在 Rails (3.2.7) 中的资产预编译有问题。

我包括一个像这样的网站图标:

<link rel="icon" type="image/png" href="<%= image_path("favicon.png") %>" />

在我设置的开发模式下config.assets.compile = true。一切正常,呈现的 HTML 如下所示:

<link rel="icon" type="image/png" href="/assets/favicon.png" />

但是在生产中,我在哪里设置config.assets.compile = false,我得到了错误

Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError in Home#index
...
favicon.png isn't precompiled

我已经跑了rake assets:precompile,我可以清楚地看到,该资产在public/assets/favicon.png.

我知道,我可以config.assets.compile = true在生产中设置,但我不想这样做(因为性能原因)。

有谁知道,为什么我的 Rails 应用程序无法解决生产中资产的正确路径?谢谢!


更新:也许知道也很有用:它不仅适用于图像,也适用于其他资产。

例如,当 config.assets.compile 设置为 false 时<%= stylesheet_link_tag "screen", :media => "all" %>也会产生错误。screen.css isn't precompiled

4

2 回答 2

1

您必须告诉 Rails 要预编译哪些资产。您可以在 config 键中config/application.rbconfig/environments/production.rb使用config.assets.precompileconfig 键执行此操作。

Rails 从要预编译的默认资产列表开始,包括["application.js", "application.css"],但是如果您也希望自己的资产也被预编译,则必须将它们添加到列表中。

例如:

# config/application.rb
module MyApp
  class Application < Rails::Application
    # other config ...

    config.assets.precompile += ["screen.css", "*.png"]
  end
end
于 2012-09-11T11:43:54.880 回答
1

好的,经过几次尝试,我想出了如何解决这个问题。尽管如此,它有点奇怪,并不能完全满足我。它只对我有用,当我设置digest为 true 并提供以下路径时manifest

config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")

知道这个“逻辑”的背后是什么会很有趣。

于 2012-09-12T14:25:42.270 回答