如何将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方法:
- 在
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
- 确保你的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逻辑,可以在视图层做处理:
- 在
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
- 在视图中渲染富文本时调用这个方法:
<%= 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
相关产品推荐
相关产品推荐

