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

Rails 7.0.4中Action Job调用OpenAI API时找不到Active Storage附件

解决方案

问题根源是File.open()仅能读取本地文件系统路径,无法处理HTTP URL,也找不到ActiveStorage文件的实际存储路径。你需要直接利用ActiveStorage的API获取文件IO流,而非使用URL或错误路径。

修改TranscriptionJob代码如下:

class TranscriptionJob < ApplicationJob
  queue_as :default
  require 'openai'

  def perform(transcription)
    client = OpenAI::Client.new(access_token: Rails.application.credentials.dig(:openai, :api_key))
    logger.info "SMC DEBUG: OpenAI Key set"
    
    # 直接通过ActiveStorage打开附件,获取IO流
    transcription.audio_file.open do |file|
      response = client.transcribe(
        parameters: {
          model: "whisper-1",
          file: file,
          filename: transcription.audio_file.filename.to_s # 可选,帮助OpenAI识别音频格式
        })
      logger.info "SMC DEBUG: transcription sent"
      transcription.transcriptionresult = response['text']
      logger.info "SMC DEBUG: TranscriptionResult is: #{transcription.transcriptionresult}"
      transcription.save
    end
  end
end

方案优势

  • 兼容所有ActiveStorage支持的存储后端(本地磁盘、S3等),无需手动处理路径差异
  • open方法会自动从存储服务下载文件并返回IO对象,无需关心文件实际位置
  • 块形式调用会自动关闭文件句柄,避免资源泄漏

模型中的audio_file_url方法无需修改,仍可正常用于前端展示下载链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:42:19