即使在rake资产之后,Rails应用程序也会为图像返回404:precompile

时间:2014-07-20 22:42:19

标签: ruby-on-rails asset-pipeline

我在Digital Ocean上部署了Rails 4应用程序。一切顺利,但应用程序返回404图像:

I, [2014-07-20T22:28:00.693171 #7751]  INFO -- : Started GET "/assets/left.png" for 128.73.51.11 at 2014-07-20 22:28:00 +0000
F, [2014-07-20T22:28:00.695271 #7751] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/assets/left.png"):
  vendor/bundle/ruby/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'

经过一些谷歌搜索后,我发现了this,据说我可以使用config.serve_static_assets = truerake assets:precompile。我尝试了两种,但仍然有404字体和图像(CSS和JS)都没问题。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

这可能无法直接解决您的问题 - 这更能说明可能出错的原因:)


<强>指纹

在不知道您的应用设置正确的情况下,这只是需要考虑的因素,但这个特定问题的主要原因是asset fingerprinting

的想法

指纹识别基本上是Rails将获取资产文件,将其编译为单个文件(通常为application.css / application.js),并允许您引用这些文件的位置愿望。

这里的问题是,如果您正在提供已经指纹识别的静态资产,您将无法再将它们作为CSS / JS的“静态”资产引用。您必须使用动态参考


<强>路径

动态引用基本上就是你使用asset_path之类的东西 - 它允许你根据需要引用路径而不管它们的文件名

通常,您将设置如下CSS:

#app/stylesheets/application.css
body {
   background: url("your/image.png");
}

这里的问题是这将直接引用图像 ,并且将无法使用所需的动态指纹路径。要解决此问题,您需要使用其中一个Rails CSS pre-processors (SASS & SCSS)

#app/assets/stylesheets/application.css.scss
body {
    background: asset_url("your/image.png"); /* Notice the path helper? */
}

动态引用的文件名/路径问题将是您应用程序可能遇到的问题之一。在没有看到你如何引用图像的情况下,我只能推测 - 但我建议你看看你正在使用哪些路径/资产助手