即使表单有错误,Active Storage也会上传图像?

时间:2019-01-31 12:02:10

标签: ruby-on-rails rails-activestorage

昨天,当我在车辆表格上进行一些测试时,除了文件上传外,我没有填写其他任何字段。我在其中放置了一些图像,然后单击了提交按钮。由于某些属性已经过验证,因此表单返回错误(如预期),但是图像已经上传。现在,如果我决定退出表格,我将不会插入任何车辆,但已经插入了图像。当我退出表单时,这些图像不会被清除。

问题:上载不仅应在验证表单中是否没有错误之后插入它们?如果这是正常程序,那么我该怎么做才能解决此问题?

我唯一想到的就是做这样的事情(我认为这样做不是明智的想法):

#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,这会很好,在这种情况下会出现此错误:

enter image description here

希望您能帮助我。谢谢!

1 个答案:

答案 0 :(得分:2)

使用“直接上载”时,文件会在附加到表单后立即上载到存储,而不是在提交表单时上载。

发生的情况是,在附加文件时,浏览器会向Rails请求向存储(S3,Azure,Google等)提供临时的直接上载URL,因此命名为Direct Upload。这意味着文件不必通过服务器进行流传输,这减轻了服务器不必要的负担。当滑轨与所述临时载URL响应,它也产生了斑点记录和发送用于该斑点到浏览器也是一个关键。

一旦浏览器成功处理了直接上载,它将在DOM中隐藏引用blob键的隐藏元素。然后,当你提交表单,如果提交操作成功,Rails会附着在斑点到您的汽车模型(使用多态ActiveStorage ::附件记录)。仅在这一点上,图像(Blob)才实际附加到您的车辆记录上。

如果表单提交失败,则Blob不会附加到您的记录中。如果发生这种情况,您将无法使用上述方法清除Blob,因为它与@vehicle没有关联。明智的解决方案可能是定期运行rake任务,搜索没有附件的Blob,然后清除它们。