Rails资产管道 - image_path助手仅在开发环境下工作

4

我在Rails(3.2.7)中遇到了关于资源预编译的问题。

我像这样包含一个favicon:

<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应用程序无法在生产环境中解析正确的资源路径吗?谢谢!
更新: 也许还有用的是:它不仅发生在图像上,也发生在其他资源上。
例如,<%= stylesheet_link_tag "screen", :media => "all" %>也会在将config.assets.compile设置为false时产生错误screen.css isn't precompiled

我正在使用公共文件夹来存储图片,因为在任何环境下都无法正常工作。 - zishe
2个回答

1

您必须告诉Rails哪些资产需要预编译。您可以在config/application.rbconfig/environments/production.rb中使用config.assets.precompile配置键来完成此操作。

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

例如:

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

    config.assets.precompile += ["screen.css", "*.png"]
  end
end

1
谢谢你的回答。但是我已经在我的application.rb中配置了额外的资产:config.assets.precompile += ["admin.css", "screen.css", "static.css", "*.png"]。所有必需的文件也都列在manifest.yml中,并且可以在/public/assets文件夹中找到。 - tomraithel

1

好的,经过几次尝试,我找到了解决方法。然而,这有点奇怪,我并不完全满意。只有当我将digest设置为true并提供manifest的路径时,它才对我起作用:

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

了解这个“逻辑”背后的原因会很有趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接