You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:17:47