【问题标题】:Active Storage upload images even when the form has errors?即使表单有错误,Active Storage 也会上传图像?
【发布时间】:2019-01-31 12:02:09
【问题描述】:

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

问题:上传不应该只在验证表单没有错误后才插入?如果这是正常程序,那么我必须做些什么来解决这个问题?

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

#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,这可以正常工作,在这种情况下会出现此错误:

希望你能帮助我。谢谢!

【问题讨论】:

    标签: ruby-on-rails rails-activestorage


    【解决方案1】:

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

    当附加文件时,浏览器会向 Rails 请求一个临时的直接上传 URL 到您的存储(S3、Azure、Google 等),因此称为 Direct Upload。这意味着文件不必通过您的服务器进行流式传输,这会带来很多不必要的压力。当 Rails 使用临时上传 URL 进行响应时,它还会创建一个 Blob 记录并将该 Blob 的密钥也发送到浏览器。

    一旦浏览器成功处理了直接上传,它将在 DOM 中隐藏一个引用 blob 键的隐藏元素。然后,当您提交表单时,如果提交操作成功,Rails 会将 Blob 附加到您的 Vehicle 模型(使用多态 ActiveStorage::Attachment 记录)。只有此时图像(Blob)才真正附加到您的车辆记录中。

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

    【讨论】:

    • 感谢您的详细解答!我在上传大尺寸图片时收到的反馈是直接上传。因为实际上我的应用程序托管在 DigitalOcean 中,并且我没有使用任何云服务,例如 S3、Azure 等(我认为是这样..)。请问如果表单提交失败,不使用直接上传并清除所有图像是否更好?再次感谢:)
    • 据我所知,如果您不使用直接上传,则不会在表单提交之前创建 Blob,因此您不会遇到此问题,并且不需要清除表单提交失败,因为 Blob 尚未创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2018-11-14
    • 2017-08-31
    • 2020-04-30
    • 2019-02-10
    • 2012-10-02
    相关资源
    最近更新 更多