Rails 5 + bootstrap-sass中Glyphicons不显示,如何存于app/assets/fonts并加载?
我遇到过完全一样的问题!把Glyphicons放在app/assets/fonts/bootstrap子目录里却加载失败,移去public虽然能用但总觉得不符合Rails的asset管理规范。下面是我整理的几个关键步骤,帮你规范地解决这个问题:
1. 让Rails Asset Pipeline识别你的字体目录
Rails默认会扫描app/assets/fonts,但如果你的字体放在子目录bootstrap里,需要明确告诉asset pipeline这个路径。打开config/application.rb,添加这行配置:
config.assets.paths << Rails.root.join('app', 'assets', 'fonts', 'bootstrap')
这样Rails就能找到bootstrap子目录下的字体文件了。
2. 修正Bootstrap的字体引用路径
Bootstrap的CSS默认用相对路径../fonts/引用字体,但在Rails的asset pipeline里,这个路径会和实际编译后的路径不匹配。最优雅的解决方式是用Sass版本的Bootstrap(如果还没切换,强烈建议转用),然后在你的自定义Sass文件(比如app/assets/stylesheets/application.scss)里覆盖字体路径变量:
// 先定义字体路径,因为我们的字体在app/assets/fonts/bootstrap下 $icon-font-path: "bootstrap/" !default; // 再导入Bootstrap @import "bootstrap";
如果是用纯CSS版本的Bootstrap,你需要手动把CSS里所有类似url('../fonts/glyphicons-halflings-regular.woff2')的引用,替换成Rails的asset helper生成的路径,比如:
url(font-path('bootstrap/glyphicons-halflings-regular.woff2'))
不过Sass版本的维护性显然更好,建议优先选择。
3. 确保字体文件被预编译
Rails默认不会预编译字体文件,所以需要在config/initializers/assets.rb里添加预编译规则:
// 预编译所有字体格式,或者针对Bootstrap的字体单独配置 Rails.application.config.assets.precompile += %w( *.woff *.woff2 *.ttf *.eot *.svg ) // 或者更精准: // Rails.application.config.assets.precompile += %w( bootstrap/glyphicons-halflings-regular.* )
4. 清除缓存并重启服务器
旧的asset缓存很可能会干扰新配置的生效,执行以下命令清理缓存:
rake assets:clean
然后重启你的Rails服务器。如果是生产环境,别忘了先预编译assets再重启:
rake assets:precompile RAILS_ENV=production
为什么放在public目录能生效?
因为public目录下的文件会直接被Web服务器(比如Nginx、Apache)提供,不需要经过Rails的asset pipeline处理,所以相对路径能直接匹配到文件。但这种方式跳过了asset pipeline的指纹化和缓存管理,长期来看不利于项目维护,所以还是推荐上面的规范做法。
内容的提问来源于stack exchange,提问作者Carson McManus

