升级至RoR6后ActiveStorage上传图片在视图中无法显示求助
从你的描述来看,附件确实已成功上传,但前端无法加载,结合测试应用正常的情况,大概率是升级过程中遗漏了ActiveStorage的某些配置,下面是几个常见的排查方向:
检查ActiveStorage路由是否配置
Rails 6中ActiveStorage需要在config/routes.rb里添加路由映射,如果你是从旧版本升级过来的,可能没加上这一行:Rails.application.routes.draw do # 其他路由... rails_active_storage.routes.draw end没有这个配置的话,浏览器请求图片的
/rails/active_storage/blobs/...路径会返回404,自然显示破碎。你可以在浏览器里直接复制图片的URL访问,看看是不是404错误。确认本地存储的权限与配置
打开config/storage.yml,检查local配置的路径是否正确,默认是:local: service: Disk root: <%= Rails.root.join("storage") %>然后确保
storage文件夹的权限正确,Rails服务器进程(比如Puma、WEBrick)需要有这个文件夹的读写权限。可以在终端执行:chmod -R 755 storage/另外,开发环境下要确保
config/environments/development.rb里设置了正确的存储服务:config.active_storage.service = :local验证图片URL的正确性
在视图里临时添加一行代码,打印出图片的实际URL:<p>Image URL: <%= @project.whiteboard_background.url if @project.whiteboard_background.attached? %></p>正常的ActiveStorage URL应该是类似
/rails/active_storage/blobs/redirect/xxxx/your-image.jpg这样的格式。如果显示的是本地文件路径(比如/storage/xxxx/your-image.jpg),那说明路由没生效,浏览器无法直接访问服务器的本地存储目录。检查服务器日志中的图片请求
当你刷新页面加载图片时,查看服务器日志,应该会有一条类似Started GET "/rails/active_storage/blobs/xxxx/your-image.jpg"的请求记录。如果没有这条记录,说明浏览器根本没发起请求(可能是URL无效);如果有但返回404,那就是路由或存储配置的问题。排除资产预编译干扰
开发环境下默认不会预编译资产,但如果你的应用有自定义的资产配置,比如强制预编译,可能会导致ActiveStorage的辅助方法生成错误的URL。可以尝试重启服务器,或者清除资产缓存:rails assets:clean
我之前升级Rails 6的时候也遇到过类似问题,就是漏加了ActiveStorage的路由配置,加上之后就正常了。你可以先从路由检查开始,这是最常见的升级遗漏点。
内容的提问来源于stack exchange,提问作者jgk

