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

如何将Rails中action-text-attachment标签的URL改为OSS直接地址?

解决Action Text附件URL替换为OSS直链的方法

要把<action-text-attachment>标签的URL从Active Storage重定向地址改成OSS直链,分两种场景处理,根据你的需求选合适的方式:

方法一:全局修改Blob的URL生成逻辑

如果希望所有Active Storage生成的URL都是OSS直链(而非重定向地址),可以通过初始化脚本覆盖Blob的url方法:

  1. 在config/initializers/active_storage.rb中添加以下代码:
Rails.application.config.to_prepare do
  ActiveStorage::Blob.class_eval do
    def url(**options)
      # 直接返回OSS服务的直链,替换默认的重定向URL
      service_url(**options)
    end
  end
end
  1. 确保你的OSS存储服务配置为公开可读(以阿里云OSS为例,在config/storage.yml里设置public: true):
oss:
  service: AliyunOSS
  access_key_id: <%= ENV['ALIYUN_ACCESS_KEY_ID'] %>
  access_key_secret: <%= ENV['ALIYUN_ACCESS_KEY_SECRET'] %>
  bucket: <%= ENV['ALIYUN_OSS_BUCKET'] %>
  endpoint: <%= ENV['ALIYUN_OSS_ENDPOINT'] %>
  public: true # 开启公开访问,生成永久直链

这样Action Text渲染<action-text-attachment>时,会自动使用OSS直链作为标签的url属性。

方法二:渲染时单独替换URL(不影响全局)

如果只想在Action Text渲染时替换URL,不改动全局Blob的URL逻辑,可以在视图层做处理:

  1. 在app/helpers/application_helper.rb中添加处理方法:
def replace_attachment_urls(content)
  return content unless content.is_a?(ActionText::Content)

  doc = Nokogiri::HTML.fragment(content.to_s)
  doc.css('action-text-attachment').each do |attachment|
    # 通过sgid找到对应的Blob对象
    blob = ActiveStorage::Blob.find_signed(attachment['sgid'])
    next unless blob

    # 构造OSS直链,可根据实际OSS路径规则调整
    oss_url = "https://www.oss-service.cn/#{blob.key}.#{blob.filename.extension}"
    attachment['url'] = oss_url
  end
  # 返回处理后的Action Text内容
  ActionText::Content.new(doc.to_html)
end
  1. 在视图中渲染富文本时调用这个方法:
<%= replace_attachment_urls(@your_model.your_rich_text_attribute) %>

两种方法都能让你拿到OSS直链,之后就可以直接在URL后追加服务商的封面生成参数(比如阿里云OSS的?x-oss-process=video/snapshot,t_0,f_jpg)来生成视频封面。

内容的提问来源于stack exchange,提问作者zhao Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:18:31