Rails 4.2.8+中stylesheet_link_tag报类型转换错误求助
你遇到的问题核心是**relative_url_root被错误设置成了哈希{}**,而非预期的字符串或nil——在Rails 4.2.8之后的版本里,asset_path方法中的File.join(relative_url_root, source)会因参数类型不匹配抛出这个转换错误。
下面是具体的排查和解决思路:
检查
relative_url_root的配置文件
去config/application.rb或各环境配置文件(config/environments/development.rb、production.rb等)中查找config.relative_url_root的设置。有没有误将它写成哈希(比如config.relative_url_root = {})?或是从环境变量读取时处理出错(比如ENV['RELATIVE_URL_ROOT']返回空值却被转换成了哈希)?把它修正为正确的字符串路径(比如/my-app),不需要的话直接注释掉即可。排查自定义初始化脚本或第三方gem
检查config/initializers目录下的所有文件,有没有代码动态修改了relative_url_root?部分gem可能会自动设置这个值,但配置不当会导致它变成哈希。你也可以在Rails控制台执行Rails.application.config.relative_url_root,确认它的实际值——如果输出是{},那肯定是某处赋值出了问题。验证asset pipeline相关配置
确认config.assets.prefix设置正常(默认是/assets),有没有和relative_url_root的配置冲突?错误的relative_url_root配置会直接影响资源路径的拼接逻辑。临时应急修复(不推荐长期使用)
如果需要快速恢复服务,可以在layout里手动指定relative_url_root为正确值,比如:= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true, relative_url_root: '' = javascript_include_tag 'application', 'data-turbolinks-track' => true, relative_url_root: ''这会强制跳过错误的
relative_url_root配置,但还是建议尽快找到根本原因并修复。
补充说明:对比Rails 4.2.7和4.2.8的actionview源码会发现,4.2.8对relative_url_root的处理逻辑增加了更严格的类型检查,旧版本对错误类型的兼容性更好,所以升级后才暴露了这个隐藏的配置问题。
内容的提问来源于stack exchange,提问作者Robby Tobby

