我希望能够将一张图像上传到两个不同的位置:一个位置在(服务器的)本地文件系统上,另一个位置是 Amazon S3(Amazon S3 位置是可选的)。
我当前的环境是 Rails 3.2.8,Ruby 1.9.3,使用 Carrierwave 上传文件。
我使用以下方法取得了一些成功:
模型
class Image < ActiveRecord:Base
attt_accessor :remote
before_save :configure_for_remote
mount_uploader :image, ImageUploader #stores images locally
mount_uploader :image_remote, ImageRemoteUploader #store images on S3
def configure_for_remote
if self.remote=="1"
self.image_remote = self.image.dup
end
end
end
相关视图表单字段(简单的表单语法)
<p><%= f.input :image, as: :file %></p>
<p><%= f.input :remote, as: :boolean %></p>
用户选中表单中的“远程”复选框并选择要上传的图像。before_save 回调将图像的副本存储到 image_remote 中,文件由各自的上传者处理,我得到了我想要的结果。
但是,当我想更新该字段时,我开始遇到问题。例如,如果用户选择首先将文件上传到本地而不是 S3(不选中远程复选框),那么稍后会返回表单并选中远程复选框。在这种情况下, before_save 回调不会运行,因为没有更改真正的活动记录列(只有远程标志)。我尝试使用 before_validation,但这无法正常工作(image_remote 上传器将正确的文件名存储在 image_remote 列中,但图像不会上传到 S3)。显然 before_validation 和 before_save 之间发生了一些变化(图像属性正在转换为上传器?)但我似乎无法弄清楚为什么这不起作用。
说了这么多,我认为我的使用方法dup
有点像黑客,我希望有人能以更优雅的方式为我提供建议,以实现我的目标。
谢谢你的帮助。