ruby-on-rails - Rails 5 ActiveStorage:为什么我的表单在重新渲染页面时忘记了选定的文件?
问题描述
我正在使用主动存储来实现表单中的文件上传。
<%= form_for @listing do |form| %>
# ...
<%= form.text_field :title, placeholder: "Title" %>
<%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
# ...
<% end %>
我在控制器中处理表单提交,如下所示:
def create
@listing = Listing.new(safe_params)
if @listing.save
flash[:success] = "Your posting has been submitted"
redirect_to root_url
else
flash.now[:warning] = @listing.errors.full_messages
render 'new'
end
end
如果验证失败,则重新呈现新页面。如果我已经输入了标题,则之前输入的标题会出现在重新呈现的表单中。但是,如果我已经选择了一个文件,则不会在重新呈现的表单中选择该文件。
我选择一个文件:
提交时,文件已上传,但验证失败并重新呈现页面。该文件不再被选中:
我不太确定这里发生了什么。为什么重新渲染新页面时不记住文件?为什么表单不显示所选文件?我需要做些什么来确保在页面重新呈现时它仍然被选中?
解决方案
你可以尝试这样的事情:
<%= form_for @listing do |form| %>
# ...
<%= form.text_field :title, placeholder: "Title" %>
<%= form.hidden_field :image, value: form.object.image.signed_id if form.object.image.attached? %>
<%= form.file_field :image, direct_upload: true, accept: "image/png,image/gif,image/jpeg" %>
# ...
<% end %>
推荐阅读
- xml - Powershell从文件中删除特定文本
- node.js - NodeJS 在数据库或属性文件中存储 mongo 聚合查询
- swift - 设计使用 Core Data NSManagedObject 的 SwiftUI 预览
- r - 按频率过滤数据
- sql - Oracle 从 Exists 子句的主查询中提取列
- openbmc - 为 webui 添加第一个 opembmc 用户
- firebase - 我会因为覆盖 firebase 的空 onchildadd() 而被收费吗?
- c - 创建启用所有支持的扩展/功能的 Vulkan 实例/设备
- python - 无法从“变形金刚”(未知位置)导入名称“管道”
- c# - 所有项目的 Visual Studio 2019 未处理异常 - 无法调试