rails 6+ 中 stylesheet_link_tag 失效的根本原因是 webpacker 默认启用导致 sprockets 路径(public/assets/)与 webpacker 输出路径(public/packs/)分离,应统一使用 stylesheet_pack_tag 并禁用 sprockets。

stylesheet_link_tag 在 Rails 6+ 中经常返回空标签或 404,根本原因不是写法错误,而是 Asset Pipeline 的底层机制发生了切换:Sprockets 和 Webpacker(或更现代的 esbuild/rollup)共存时路径不互通,必须明确选择并清理另一方。
判断当前项目用的是 Sprockets 还是 Webpacker/Importmap
打开 config/application.rb 或 config/environments/development.rb,搜索以下关键词:
- 若存在
config.assets.enabled = true且无config.webpacker或config.importmap相关配置 → 极大概率是纯 Sprockets(Rails ≤ 5 或--skip-webpacker创建) - 若存在
config.importmap.enabled = true(Rails 7 默认)→ CSS 必须通过import声明,stylesheet_link_tag仅对app/assets/stylesheets/有效,但默认不启用该目录 - 若存在
config.webpacker.enabled = true或已运行过rails webpacker:install→stylesheet_link_tag查 public/assets/,而实际 CSS 输出在 public/packs/,必然 404
再确认 app/assets/stylesheets/application.css 是否还存在:它只是个清单文件,不是普通 CSS;而 Rails 7 默认连这个目录都不生成。
Rails 7+(Importmap 默认)怎么引入自定义 CSS
Rails 7 默认使用 importmap 管理 JS,CSS 则推荐走 app/assets/stylesheets/ + Sprockets,但需手动启用——因为默认 config.assets.enabled 是 false。
- 在
config/application.rb中取消注释或添加:config.assets.enabled = true - 确保
app/assets/stylesheets/application.css存在,并含/* *= require_tree . */指令 - 在
app/views/layouts/application.html.erb中用: - 若要用 SCSS,把文件改为
application.scss,并确保gem 'sassc-rails'在 Gemfile 中(Rails 7 默认已包含)
注意:importmap 不处理 CSS,所以不要试图在 importmap.rb 里 import .css 文件——它只认 JS 模块。
Rails 6(Webpacker)下为什么 stylesheet_link_tag 'application' 不加载 CSS
因为 Webpacker 完全绕过 Sprockets:它把 app/javascript/packs/application.js 作为入口,所有样式必须显式 import './src/styles/application.css',然后由 Webpack 编译进 public/packs/。
-
stylesheet_link_tag仍查public/assets/→ 找不到 → 返回空标签或 404 - 正确做法是改用:
(注意是_pack_,不是_link_) - 同时确保
app/javascript/packs/application.js中有import '../src/styles/application.css',且路径相对于该文件 - 如果还留着
app/assets/stylesheets/,建议删掉或禁用 Sprockets 中间件,否则可能引发资源重复编译或缓存混乱
生产环境部署前,务必运行 rails assets:precompile(Sprockets)或 rails webpacker:compile(Webpacker),二者不能混用。
容易被忽略的关键点
很多人卡在「明明写了 stylesheet_link_tag,但浏览器 Network 面板里根本没有 /assets/application.css 请求」——这不是代码问题,是资产管道没通电。
- Rails 6+ 默认不启动 Sprockets 中间件,即使你保留了
app/assets/目录,config.assets.enabled = false就等于关掉了整个 Sprockets 引擎 -
application.css里的require_self和require_tree只在 Sprockets 下生效;Webpacker 下它们被完全忽略 - 开发时开启
config.assets.check_precompiled_asset = false(默认 true)可避免因预编译缺失导致的 404,但别在生产环境关它 - 如果你用 Tailwind 或 Bootstrap,它们的安装文档通常默认面向 Webpacker 或 Importmap,直接套用 Sprockets 步骤会失败
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











