在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

Rob*_*ban 7 ruby-on-rails rails-activestorage ruby-on-rails-6

在 Rails 6 中,我有一个带有文件字段的表单,我使用 activestorage 来存储文件。如果提交表单后验证失败,则会重新显示表单,显示验证错误。重新显示表单时如何保留添加到文件字段的文件,以便用户不必再次将文件添加到表单?

rails 5 已经有一个类似的问题:Active Storage: Best practice to retain/cache Uploaded file when form redisplays,但是那里的解决方案只适用于 Rails 5。

Rob*_*ban 7

由于 Rails 6 不存储分配的文件,我发现的解决方法是在文件字段上启用直接上传。这将在提交表单之前通过 JavaScript 上传文件。

= f.file_field :doc, direct_upload: true
Run Code Online (Sandbox Code Playgroud)

为此,您还需要将 activestorage.js 添加到您的捆绑包中,如Active Storage 指南中所述。

进行此更改后,可以使用问题Active Storage:表单重新显示时保留/缓存上传文件的最佳实践中描述的方法。这意味着将signed_id 添加到表单的隐藏字段中,如下所示:

= f.file_field :doc, direct_upload: true
= f.hidden_field :doc, value: f.object.doc.signed_id if f.object.doc.attached?
Run Code Online (Sandbox Code Playgroud)

  • 隐藏字段不应该放在第一位吗?https://youtu.be/mG1BUMuSmsc?t=577 (2认同)