Rails4升级至5.0.7.2后stylesheet_link_tag报nil错误求助
问题定位
报错undefined method 'start_with?' for nil:NilClass触发于stylesheet_link_tag调用,本质是asset pipeline在查找指定样式文件时返回了nil,后续调用start_with?方法时抛出异常。
修复方案
排查缺失的样式文件
逐个注释stylesheet_link_tag中的参数,重新访问页面,定位到导致报错的具体文件。比如先保留第一个参数测试:<%= stylesheet_link_tag 'fontawesome-free-5.1.1-web/css/all.min' %>测试后再依次添加其他参数,找到不存在或路径错误的文件,修正其路径或确保文件存在于
app/assets/stylesheets、vendor/assets/stylesheets等asset目录下。修正asset路径配置
确认config/application.rb中已包含fontawesome所在目录:config.assets.paths << Rails.root.join('app', 'assets', 'stylesheets', 'fontawesome-free-5.1.1-web', 'css')若fontawesome放在vendor目录下,调整路径为
Rails.root.join('vendor', 'assets', 'stylesheets', 'fontawesome-free-5.1.1-web', 'css')。更新asset预编译规则
在config/initializers/assets.rb中添加需要预编译的fontawesome文件(带.css后缀):Rails.application.config.assets.precompile += %w( fontawesome-free-5.1.1-web/css/all.min.css fontawesome-free-5.1.1-web/css/brands.min.css fontawesome-free-5.1.1-web/css/fontawesome.min.css fontawesome-free-5.1.1-web/css/regular.min.css tbs/font.css )Rails 5对asset预编译的默认规则更严格,未显式声明的非标准命名文件可能无法被正确处理。
清理asset缓存并重启服务
执行以下命令清理旧缓存,开发环境下重启Rails服务器:rails assets:clean rails assets:clobber生产环境需重新预编译assets:
rails assets:precompile RAILS_ENV=production匹配兼容的asset相关gem版本
确保Gemfile中sass-rails、sprockets-rails版本与Rails 5.0.7.2兼容:gem 'sprockets-rails', '~> 3.1.1' gem 'sass-rails', '~> 5.0'执行
bundle install更新依赖后重启服务。调整stylesheet_link_tag参数格式
将参数改为数组形式,部分情况下可避免Rails 5的参数解析问题:<%= stylesheet_link_tag [ 'fontawesome-free-5.1.1-web/css/all.min', 'fontawesome-free-5.1.1-web/css/brands.min', 'fontawesome-free-5.1.1-web/css/fontawesome.min', 'fontawesome-free-5.1.1-web/css/regular.min', 'tbs/font' ] %>
内容的提问来源于stack exchange,提问作者opensource-developer

