活动存储:表单重新显示时保留/缓存上传文件的最佳实践

Posted

技术标签:

【中文标题】活动存储:表单重新显示时保留/缓存上传文件的最佳实践【英文标题】:Active Storage: Best practice to retain/cache uploaded file when form redisplays 【发布时间】:2018-10-25 21:12:54 【问题描述】:

当使用 Active Storage 上传文件时,当文件完成上传并重新显示表单时,例如当该表单的验证由于某种原因失败时,文件就消失了。

有没有办法在表单重新显示之间缓存或保留它? Shrine has a nice Plugin 为此,我正在为 Active Storage 寻找类似的东西。

【问题讨论】:

你有办法解决这个问题吗? 很遗憾没有。仍然坚持使用 Shrine,它工作得很好,还有一些其他很棒的功能仍然缺少 Active Storage,比如将文件作为数据 URI 上传。 @cseelus 下面发布的解决方案 dmitry 有什么问题?我知道它会在 Rails 6 中停止工作,但它可以工作。而且明年6.0降下来就可以轻松移除了。 【参考方案1】:

对于那些寻找has_many_attached 解决方案的人

https://github.com/rails/rails/issues/35817#issuecomment-484158884

<% if @product.photos.attached? %>
  <% @product.photos.each do |ph| %>
    <%= f.hidden_field :photos, value: ph.signed_id %>
  <% end %>
<% end %>

【讨论】:

您在 Rails API 文档中的哪个位置看到 hidden_​​field 助手接受“multiple: true”选项?另外我不知道 html 规范允许在输入上使用这样的属性 对不起,这可能是一个错字(你是对的,多个不是一个选项 + 不需要多个,因为我正在用#each 循环浏览照片)让 mi 修复它。 (multilple: true 已移除)【参考方案2】:

这是使 ActiveStorage 文件在表单重新显示时保持不变的解决方案: f.hidden_field :image, value: f.object.image.signed_id if f.object.image.attached? f.file_field :image

【讨论】:

Dmitry 我现在想给你买很多啤酒,你救了我的理智!谢谢! 对于任何想要使用它的人,请注意,不幸的是,这与 Rails master 中的新更改不兼容,它将新上传的文件存储在保存而不是分配 github.com/rails/rails/pull/33303 幸运的是,Rails 6 将发生重大变化,这只是一个遥远的未来。 Rails 5.2.1 现在有signed_id 值:) 如果有人在 Rails 6 中有这个问题的解决方案,请回答这个问题:***.com/questions/56649565/…

以上是关于活动存储:表单重新显示时保留/缓存上传文件的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在用户注销时保留 CoreData 对象的最佳方法(NSUserDefaults?)

上传的文件在您的服务器上保留多长时间?

使用 jquery 删除活动存储附件并重新渲染附件有帮助吗?最佳做法是啥?

CarrierWave/Cloudinary 缓存的图像在开发环境中无法跨表单重新显示

使用文件字段编辑 Django 模型而不重新上传文件

如何使用默认文件存储(S3)通过 Django FormTools 表单向导上传文件?