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

Rails 5中如何使用CarrierWave上传程序生成的CSV文件?

问题说明

需要在应用中通过CarrierWave将内部生成的.csv文件上传到云端,本地测试上传器功能时,直接给挂载了上传器的字段赋值csv字符串,执行room.save!后,数据库的file字段值为nil,需要实现csv上传且关联到对应数据库字段,最终可获取文件下载URL。

现有实现代码

/uploaders/file_uploader.rb

class FileUploader < CarrierWave::Uploader::Base
 # Choose what kind of storage to use for this uploader:
 storage :file

 # define some uploader specific configurations in the initializer
 # to override the global configuration

 def store_dir
   "uploads/#{model.id}"
 end
end

/models/rooms.rb

class Rooms < ApplicationRecord
  mount_uploader :file, FileUploader

end

/services/generate_csv

require 'csv'

class GenerateCsv

  def initialize(room)
    @room = room
  end

  def build
   csv_string = gen_csv
   @room.file = csv_string
   @room.save!
  end

  def gen_csv
    CSV.generate do |csv|
      csv << headers

      users.each do |user|
        csv << GenerateRow.gen(room: @room)
      end
    end
  end

end
解决方案

不需要额外生成本地磁盘的csv文件,CarrierWave支持接收IO类对象作为上传源,只需将生成的csv字符串用StringIO封装后再赋值即可。

修改/services/generate_csv中的build方法代码:

...
  def build
   csv_string = gen_csv
   @room.file = StringIO.new(csv_string)
   @room.save!
  end
...

修改后保存即可正常上传,后续可通过@room.file.url直接获取文件的下载地址。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:06:04