本地预编译Rails资产时SCSS背景URL变为绝对路径,如何保留相对路径
解决方案
核心原因排查
本地预编译时如果没有指定生产环境,会默认加载开发环境配置,自动将asset_host设为http://localhost:3000,导致所有资源URL被拼接上本地域名。首先确认你执行预编译的命令是:
RAILS_ENV=production bundle exec rake assets:precompile
永久配置方案
如果指定生产环境后还是生成绝对路径,修改生产环境配置文件config/environments/production.rb,添加/调整以下参数:
- 禁用自动拼接资源域名
config.action_controller.asset_host = nil config.action_mailer.asset_host = nil - 调整资产前缀为相对路径,不要添加前置斜杠
config.assets.prefix = "assets" - 检查全局配置文件
config/application.rb,确保没有设置全局的config.asset_host参数,避免覆盖生产环境的配置 - 如果你使用
sass-rails处理SCSS文件,额外添加以下配置关闭绝对路径生成:config.sass.preferred_syntax = :scss config.sass.line_comments = false config.sass.cache = false
特殊场景适配
如果你的CSS文件最终部署路径和资源目录层级不一致,比如CSS文件存放在/assets/stylesheets/,图片存放在/assets/images/,可以将资产前缀调整为相对当前CSS文件的路径:
config.assets.prefix = "../assets"
调整后SCSS中image-url('home.png')会生成../assets/home.png的相对路径,适配不同层级的资源引用需求。
内容的提问来源于stack exchange,提问作者Saqib Shahzad
相关产品推荐
相关产品推荐

