我使用CarrierWave上传和管理ActiveRecord模型上的资源。我已经定义了我自己的Uploader并将其安装到我的一个模型上的一堆属性中,如下所示:
class Theme < ActiveRecord::Base
...
mount_uploader :masthead, ThemeResourceUploader
mount_uploader :background, ThemeResourceUploader
mount_uploader :footer, ThemeResourceUploader
...
end
从我的Rails控制器中的params创建新主题时,这可以正常工作,但除了允许用户一次上传一个图像之外,我还想让他们上传包含所有这些图像的zip文件。然后使用此zip来构建主题。
为了尝试完成此操作,我为zip文件和控制器方法创建了一个新的上传器,该方法使用Rubyzip在内存中提取上传的zip,然后尝试将结果流分配给我的ActiveRecord模型的属性。 / p>
def import
require 'zip'
@theme = Theme.new
zip_upload = params.require(:theme).require(:zip)
uploader = ThemeImportUploader.new
uploader.cache!(zip_upload)
Zip::File.open(uploader.file.path) do |zip_file|
@theme.masthead = zip_file.get_input_stream('masthead.png')
@theme.background = zip_file.get_input_stream('background.png')
@theme.footer = zip_file.get_input_stream('footer.png')
end
@theme.save
end
不幸的是,这不起作用。我没有收到任何错误或失败,但主题会保存为资源的空值,并且文件不会在我的上传文件夹中创建。
我相信我可以通过将zip解压缩到临时文件然后将这些文件读入CarrierWave属性来实现这一点,但这似乎是一种解决问题的方法。
如何在内存中上传和提取zip并将其内容分配给我的CarrierWave增强型号?