Rails中Devise登录页用video_tag嵌视频遇资源未预编译报错
问题核心原因
你遇到的Sprockets::Rails::Helper::AssetNotPrecompiled报错,本质是Rails 6默认资源加载规则导致的:
- 在
application.rb中将app/assets/videos加入Sprockets扫描路径的操作是正确的,但Rails默认仅自动识别JS、CSS、常见图片后缀的文件为可预编译资源,.mp4这类大体积媒体文件不会被自动纳入白名单 - 仅设置
config.assets.debug = false只是关闭了开发环境下的资源拆分加载逻辑,并不会跳过“资源必须预编译才能被helper引用”的校验规则,因此报错不会消失
分步修复操作
- 手动将视频文件加入资源预编译白名单
打开config/initializers/assets.rb,在文件末尾追加配置:
后续如果新增其他视频资源,直接在数组中追加对应文件名即可。Rails.application.config.assets.precompile += %w( login-video.mp4 ) - 修正视图中
video_tag的参数写法
原代码中传入Symbol类型的布尔属性不是Rails helper推荐的兼容写法,调整为直接传布尔值,可保证所有浏览器正常识别媒体标签属性:<%= video_tag 'login-video.mp4', autoplay: true, loop: true, muted: true %> - 执行本地资源预编译并重启服务
在项目根目录执行命令:
执行完成后重启Rails服务,即可正常加载登录页视频,不会再抛出未预编译的报错。rails assets:precompile - 可选优化:减少重复配置
如果项目内视频资源较多,不想每次新增视频都手动修改白名单,可以在assets.rb中配置自动扫描规则,将app/assets/videos目录下所有mp4文件自动纳入预编译范围:Rails.application.config.assets.precompile += Dir[Rails.root.join('app', 'assets', 'videos', '*.mp4')]
内容的提问来源于stack exchange,提问作者raphael-allard
相关产品推荐
相关产品推荐

