昨天,当我在车辆表格上进行一些测试时,除了文件上传外,我没有填写其他任何字段。我在其中放置了一些图像,然后单击了提交按钮。由于某些属性已经过验证,因此表单返回错误(如预期),但是图像已经上传。现在,如果我决定退出表格,我将不会插入任何车辆,但已经插入了图像。当我退出表单时,这些图像不会被清除。
问题:上载不仅应在验证表单中是否没有错误之后插入它们?如果这是正常程序,那么我该怎么做才能解决此问题?
我唯一想到的就是做这样的事情(我认为这样做不是明智的想法):
#vehicles_controller.rb
def create
@vehicle = Vehicle.new(vehicle_params)
if @vehicle.save
redirect_to @vehicle
else
@vehicle.images.purge <--------
render 'new'
end
end
如果我不使用Active Storage的direct upload,这会很好,在这种情况下会出现此错误:
希望您能帮助我。谢谢!
答案 0 :(得分:2)
使用“直接上载”时,文件会在附加到表单后立即上载到存储,而不是在提交表单时上载。
发生的情况是,在附加文件时,浏览器会向Rails请求向存储(S3,Azure,Google等)提供临时的直接上载URL,因此命名为Direct Upload。这意味着文件不必通过服务器进行流传输,这减轻了服务器不必要的负担。当滑轨与所述临时载URL响应,它也产生了斑点记录和发送用于该斑点到浏览器也是一个关键。
一旦浏览器成功处理了直接上载,它将在DOM中隐藏引用blob键的隐藏元素。然后,当你提交表单,如果提交操作成功,Rails会附着在斑点到您的汽车模型(使用多态ActiveStorage ::附件记录)。仅在这一点上,图像(Blob)才实际附加到您的车辆记录上。
如果表单提交失败,则Blob不会附加到您的记录中。如果发生这种情况,您将无法使用上述方法清除Blob,因为它与@vehicle
没有关联。明智的解决方案可能是定期运行rake任务,搜索没有附件的Blob,然后清除它们。