Heroku:ActionController::RoutingError(没有路由匹配 [GET]“/fonts/glyphicons-halflings-regular.ttf)

Heroku: ActionController::RoutingError (No route matches [GET] "/fonts/glyphicons-halflings-regular.ttf)

我在 Heroku 上遇到以下错误:

ActionController::RoutingError (No route matches [GET] "/fonts/glyphicons-halflings-regular.ttf)

当服务器尝试从供应商资产中查找 Bootstrap 的 halflings images 时:

当我在本地使用 Puma 和 Foreman 运行 应用程序时,它工作正常,因为那些半身人图像出现了。

Heroku日志如下图:

2015-02-24T06:15:45.302830+00:00 app[web.1]: source=rack-timeout id=983308e6-3d6f-494b-b8e1-f37b39b14d42 wait=11ms timeout=20000ms service=2ms state=completed
2015-02-24T06:15:45.302416+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/puma-2.11.1/lib/puma/server.rb:375:in `process_client'
2015-02-24T06:15:45.304253+00:00 heroku[router]: at=info method=GET path="/fonts/glyphicons-halflings-regular.woff" host=fathomless-sands-8666.herokuapp.comrequest_id=983308e6-3d6f-494b-b8e1-f37b39b14d42 fwd="212.149.201.185" dyno=web.1 connect=6ms service=6ms status=404 bytes=1531
2015-02-24T06:15:45.506425+00:00 heroku[router]: at=info method=GET path="/fonts/glyphicons-halflings-regular.ttf" host=fathomless-sands-8666.herokuapp.comrequest_id=41275bad-2ed7-4cfd-89c5-d223b6063d62 fwd="212.149.201.185" dyno=web.1 connect=28ms service=37ms status=404 bytes=1531
2015-02-24T06:15:45.476848+00:00 app[web.1]: Started GET "/fonts/glyphicons-halflings-regular.ttf" for 212.149.201.185 at 2015-02-24 06:15:45 +0000
2015-02-24T06:15:45.478340+00:00 app[web.1]: 
2015-02-24T06:15:45.478344+00:00 app[web.1]: ActionController::RoutingError (No route matches [GET] "/fonts/glyphicons-halflings-regular.ttf"):
2015-02-24T06:15:45.478347+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
2015-02-24T06:15:45.471994+00:00 app[web.1]: source=rack-timeout id=41275bad-2ed7-4cfd-89c5-d223b6063d62 wait=33ms timeout=20000ms state=ready
2015-02-24T06:15:45.478349+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
2015-02-24T06:15:45.478351+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/railties-4.0.2/lib/rails/rack/logger.rb:38:in `call_app'
2015-02-24T06:15:45.478353+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/railties-4.0.2/lib/rails/rack/logger.rb:20:in `block in call'
2015-02-24T06:15:45.478355+00:00 app[web.1]:   vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.2/lib/active_support/tagged_logging.rb:67:in `block in tagged'

application.css 文件

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the top of the
 * compiled file, but it's generally better to create a new file per style scope.
 *= require bootstrap/dist/css/bootstrap
 *= require_self
 *= require_tree .
 */

.bower.json 文件:

{
  "name": "bootstrap",
  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
  "version": "3.3.2",
  "keywords": [
    "css",
    "js",
    "less",
    "mobile-first",
    "responsive",
    "front-end",
    "framework",
    "web"
  ],
  "homepage": "http://getbootstrap.com",
  "main": [
    "less/bootstrap.less",
    "dist/css/bootstrap.css",
    "dist/js/bootstrap.js",
    "dist/fonts/glyphicons-halflings-regular.eot",
    "dist/fonts/glyphicons-halflings-regular.svg",
    "dist/fonts/glyphicons-halflings-regular.ttf",
    "dist/fonts/glyphicons-halflings-regular.woff"
  ],
  "ignore": [
    "/.*",
    "_config.yml",
    "CNAME",
    "composer.json",
    "CONTRIBUTING.md",
    "docs",
    "js/tests",
    "test-infra"
  ],
  "dependencies": {
    "jquery": ">= 1.9.1"
  },
  "_release": "3.3.2",
  "_resolution": {
    "type": "version",
    "tag": "v3.3.2",
    "commit": "bcf7dd38b5ab180256e2e4fb5da0369551b3f082"
  },
  "_source": "git://github.com/twbs/bootstrap.git",
  "_target": "~3.3.2",
  "_originalSource": "bootstrap",
  "_direct": true
}

那些半身人可以在我项目的两个文件夹中找到: vendor/assets/bower_components/bootstrap/dist/fonts vendor/assets/bower_components/bootstrap/fonts

除了那些半身人图像,应用程序运行良好:

我之前删除了 public/assets 提交的目录并重新部署到 Heroku,这解决了我的老问题 感谢史蒂夫。旧问题中的错误消息(当导航栏没有出现时)与这个非常相似,所以这个问题也可能与资产有关。

如果您觉得这个问题很熟悉,请留言。非常感谢:-)

可以在 GitHub

找到部署到 Heroku 的代码

你有几个问题。

  • 字体资产不在 sprockets 已知的路径中,因此在资产编译开启(即生产)时不会提供它们。
  • 即使您修复了资产编译,您使用的是 bootstrap.css 的静态版本,因此无法将字体资产的路径设置为匹配 rails 放置它们的位置。

解决方案:

  1. 使用官方 bootstrap-sass bower 包,它将使用正确的字体路径编译 bootstrap。

    安装 bower-sass 并移除 vanilla bootstrap:

      bower uninstall bootstrap --save
    bower install bootstrap-sass --save
    
  2. application.css 移动到 application.css.scss。在 mainfest 部分之后添加以下行。

    $icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/";
    @import "bootstrap-sass/assets/stylesheets/bootstrap-sprockets";
    @import "bootstrap-sass/assets/stylesheets/bootstrap";
    

    您还必须确保删除此行,因为 bootstrap 的非 sass 版本已被删除。

    *= require bootstrap/dist/css/bootstrap
    
  3. 将出售的资产路径添加到 application.rb 以便 rails 可以编译和提供它们。

    您 application.rb 也需要更新,以便 Rails 知道资产所在的位置。根据官方 bootstrap-sass 文档 (https://github.com/twbs/bootstrap-sass#c-bower):

    # Bower asset paths
    root.join('vendor', 'assets', 'bower_components').to_s.tap do |bower_path|
      config.sass.load_paths << bower_path
      config.assets.paths << bower_path
    end
    # Precompile Bootstrap fonts
    config.assets.precompile << %r(bootstrap-sass/assets/fonts/bootstrap/[\w-]+\.(?:eot|svg|ttf|woff2?)$)
    # Minimum Sass number precision required by bootstrap-sass
    ::Sass::Script::Number.precision = [8, ::Sass::Script::Number.precision].max
    

这应该可以解决问题,您的字形现在应该可以加载了。