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
相关产品推荐
相关产品推荐

