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

时间:2015-02-24 11:09:56

标签: twitter-bootstrap ruby-on-rails-4 heroku

我在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

除了那些半身像,该应用程序工作正常:

enter image description here

我之前删除了public/assets目录已提交并重新部署到Heroku,这解决了我的旧问题https://stackoverflow.com/a/28681947/2048391,感谢史蒂夫。旧版本中的错误消息(当导航栏未显示时)与此版本非常相似,因此此问题也可能与资产有关。

如果您觉得这个问题很熟悉,那么请放弃一行。非常感谢: - )

可以在GitHub

找到部署到Heroku的代码

1 个答案:

答案 0 :(得分:8)

这里有几个问题。

  • 字体资产不在链轮已知的路径中,因此在启用资产编译(即生产)时不会提供它们。
  • 即使您修复了资产编译,也使用的是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";
    

    你必须确保删除此行,因为删除了非sass版本的bootstrap。

    *= require bootstrap/dist/css/bootstrap
    
  3. 将vendored assets路径添加到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
    
  4. 这应该可以解决问题,现在应该加载你的字形。