升级Rails 7.1后创建带附件记录使用url_for报错的解决咨询
升级至Rails 7.1后,创建新记录时在响应中使用
url_for出现错误 创建带有一张附件图片的Chat对象后,响应需包含该图片的URL。使用url_for(chat.picture)时会触发错误:
ActionView::Template::Error: Cannot get a signed_id for a new record.
此时图片已成功关联到Chat对象,改用chat.picture.url则不会出错,但希望使用url_for以返回相对URL。
Chat模型配置:
has_one_attached :picture, service: :chat_pictures
关联图片的代码:
@chat.picture.attach(params[:chat][:picture])
解决方案
1. 确保记录及附件完成持久化后再调用url_for
Rails 7.1中url_for生成ActiveStorage附件URL时,要求附件所属的父记录(Chat)必须已持久化到数据库,且附件本身的关联状态已确认。若在创建Chat时同步关联附件,可先保存Chat再执行attach操作,或调用reload刷新记录状态:
# 先保存Chat再关联附件 @chat = Chat.create(chat_params) @chat.picture.attach(params[:chat][:picture]) # 此时再调用url_for relative_url = url_for(@chat.picture) # 或在attach后刷新记录 @chat.picture.attach(params[:chat][:picture]) @chat.reload relative_url = url_for(@chat.picture)
2. 使用rails_blob_path替代url_for生成相对URL
rails_blob_path是Rails提供的专门生成ActiveStorage附件路径的辅助方法,可直接指定返回相对路径,效果与url_for一致,且能规避signed_id生成问题:
relative_url = rails_blob_path(@chat.picture, only_path: true)
3. 配置存储服务默认返回相对URL
若希望chat.picture.url直接返回相对路径,可在config/storage.yml中对应服务的配置里添加url_options:
chat_pictures: service: <你的存储服务,比如S3/本地> # 其他配置... url_options: only_path: true
配置后,chat.picture.url将返回相对路径,无需再使用url_for。
内容的提问来源于stack exchange,提问作者Phil-6
相关产品推荐
相关产品推荐

