Ruby on Rails应用引入Bootstrap与JS后部分样式加载失败,报路由错误
问题分析
你遇到的ActionController::RoutingError是因为Rails资产管道(Sprockets)无法识别页面中引用的/lib/uniform.default.css路径,核心原因要么是资源文件存放位置不符合资产管道规范,要么是manifest.js配置混乱,或是页面引用方式错误。
解决步骤:
统一资源文件存放位置
所有前端资源必须放在Rails资产管道的标准目录下:- 自定义CSS/JS文件放到
app/assets/stylesheets/、app/assets/javascripts/ - Bootstrap这类第三方库建议放到
vendor/assets/stylesheets/、vendor/assets/javascripts/
比如把uniform.default.css移到app/assets/stylesheets/lib/或者vendor/assets/stylesheets/lib/,不要放在非标准目录下。
- 自定义CSS/JS文件放到
清理并修正
manifest.js配置
当前配置里有重复的link_tree规则(比如../images和../img),会导致解析混乱,改成简洁准确的配置://= link_tree ../images //= link_directory ../stylesheets .css //= link_tree ../javascripts .js //= link_tree ../../../vendor/assets/stylesheets .css //= link_tree ../../../vendor/assets/javascripts .js //= link bookmarklet.coffee注意:
link_directory会包含指定目录下的所有文件(含子目录),link_tree会递归包含所有子目录文件,要明确后缀(比如.css),避免引入无关文件。修正页面资源引用方式
不要写硬编码路径/lib/uniform.default.css,改用Rails的资产辅助方法:<%= stylesheet_link_tag 'lib/uniform.default' %>如果是在CSS文件中引入其他样式,用相对路径的
@import:@import 'lib/uniform.default';这样Sprockets会自动处理路径,生成正确的编译后URL。
清理缓存并重启服务
运行命令清理旧的编译资产:rails assets:clobber开发环境直接重启Rails服务器,生产环境额外执行
rails assets:precompile,确保新配置生效。Bootstrap的正确引入方式
如果用gem安装Bootstrap,直接在application.css中添加:@import 'bootstrap';手动下载的话,把Bootstrap的css/js文件放到
app/assets/stylesheets/和app/assets/javascripts/,再在manifest.js或application系列文件中引入即可。
内容的提问来源于stack exchange,提问作者NIYAS Tk

